Binding
拡張子のプロパティの入力ミスが原因で発生したデータバインディングの問題をデバッグしようとした数時間後。間違いに気づいたら、IntelliSenseが利用可能であれば、そもそも間違いを犯していない可能性があることに気づきました。名前の入力ミス時にエラー/警告に慣れているVisualStudioユーザーとして。おそらく私は甘やかされていますが、IntelliSenseの欠如がエラーにつながりました。
調査を行ったところ、使用している Intellisense for DataBindingが利用可能です (Ultimate edition)であることがわかりました。ブログの2番目の例に従って、簡単なWPFアプリを作成してみました。まず、ブログの2番目の例で、コンパイラエラーの原因となったエラーがあるようです。 接頭辞Type=ViewModel:MainViewModel
属性とd:
コンパイラエラーを修正しましたが、View-ModelクラスのプロパティがIntellisenseメニューに表示されません。私のコードは以下にあります GitHub 。
MainViewModel.cs:
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace IntelliSenseForDataBinding
{
public class MainViewModel : INotifyPropertyChanged
{
public MainViewModel()
{
Greeting = "Hello World";
Answer = 42;
}
private string _Greeting;
public string Greeting
{
get { return _Greeting; }
set { _Greeting = value; OnPropertyChanged(); }
}
private int _Answer;
public int Answer
{
get { return _Answer; }
set { _Answer = value; OnPropertyChanged(); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
MainWindow.xaml:
<Window x:Class="IntelliSenseForDataBinding.MainWindow"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.Microsoft.com/expression/blend/2008"
mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="450"
d:DataContext="{d:DesignInstance Type=MainViewModel, IsDesignTimeCreatable=True}"
Title="MainWindow" Height="350" Width="525">
<Grid>
</Grid>
</Window>
MainWindows.xaml.cs:
using System.Windows;
namespace IntelliSenseForDataBinding
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
DataContext = new MainViewModel();
InitializeComponent();
}
}
}
これが機能していない証拠です:
IntelliSenseメニューに「Greeting」プロパティの項目が表示されることを期待します。なぜそこにないのかについての提案はありますか?念のため、VisualStudioの設定をデフォルトにリセットしてみました。
さらに、Binding属性でタイプミスしたプロパティ名を防止または検出するための追加の方法に関する提案はありますか?
Visual Studio 2013でGitHubプロジェクトを開きましたが、同じ動作がしました。バインディング用のIntelliSenseはありません。
設計データは失敗しているバインディング解決の鍵であるため、これをお勧めします。
xmlns:local="clr-namespace:IntelliSenseForDataBinding"
これは解決 VMの場所に役立ちます。d:DataContext
をd:Type
の代わりにlocal
名前空間を使用するように変更します。基本的に、使用しようとしているタイプの場所を指定します:d:DataContext="{d:DesignInstance local:MainViewModel, IsDesignTimeCreatable=True}"
証明:
遅れていることはわかっていますが、Kcvinの回答は本当に役に立ちました。また、一部のクラスではDataType
を使用できるため、intelliSenseが魔法のように機能することもできます。
例:
<DataTemplate x:Key="ItemTemplate" DataType="entities:Item">
<Grid Height="60">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
Text=""
Style="{StaticResource MediumIconStyle}"
Margin="{StaticResource XSmallLeftMargin}"
AutomationProperties.Name="List item icon" />
<StackPanel
Grid.Column="1"
Margin="{StaticResource SmallLeftMargin}"
VerticalAlignment="Center">
<TextBlock Style="{StaticResource ListTitleStyle}" Text="{Binding Name}" />
<TextBlock Style="{StaticResource ListSubTitleStyle}" Text="{Binding Description}" />
</StackPanel>
</Grid>
</DataTemplate>
これが将来誰かに役立つことを願っています。