ListView DataTemplate 内の標準コントロールをカスタム コントロールに置き換えようとしていますが、バインディングが正しく機能していないようです。ListView の定義は次のとおりです。
<Grid>
<ListView ItemsSource="{Binding DataItemsCollection}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="Static text" />
<TextBlock Text="{Binding DataItemText}" />
<BindingTest:CustomControl CustomText="{Binding DataItemText}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
DataItemsCollection は監視可能な型のコレクションです
public class DataItemClass : INotifyPropertyChanged
{
string _dataItemText;
public string DataItemText
{
get { return _dataItemText; }
set { _dataItemText = value; Notify("DataItemText"); }
}
public event PropertyChangedEventHandler PropertyChanged;
public void Notify(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
メイン ウィンドウのコードは次のようになります。
public partial class MainWindow : Window
{
public ObservableCollection<DataItemClass> _dataItemsCollection = new ObservableCollection<DataItemClass>
{
new DataItemClass { DataItemText = "Test one" },
new DataItemClass { DataItemText = "Test two" },
new DataItemClass { DataItemText = "Test three" }
};
public ObservableCollection<DataItemClass> DataItemsCollection
{
get { return _dataItemsCollection; }
}
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
}
カスタム コントロールは簡単です。
<StackPanel Orientation="Horizontal">
<Label Content="Data Item:" />
<TextBlock Text="{Binding CustomText, Mode=OneWay}" />
</StackPanel>
CustomText が次のように定義されている場合
public static DependencyProperty CustomTextProperty = DependencyProperty.Register(
"CustomText", typeof(string), typeof(CustomControl), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public string CustomText
{
get { return (string)GetValue(CustomTextProperty); }
set { SetValue(CustomTextProperty, value); }
}
このプロジェクトを実行すると、DataTemplate の 2 番目の TextBlock に正しいテキストが表示されますが、カスタム コントロール内には表示されません。私は何を間違っていますか?