ListView中的UserControl DependencyProperty绑定
当我尝试在ListView中使用自定义UserControl时,它会失败并且只显示空块(但下面的TextBlock可以正常工作)。 虽然ListView外部的customControl工作得很好。 有什么问题?
MainWindow.xaml
MainWindow.cs
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); InitializeMyComponent(); } public System.Collections.ObjectModel.ObservableCollection CustomCollection { get; set; } private void InitializeMyComponent() { this.CustomCollection = new System.Collections.ObjectModel.ObservableCollection(); this.CustomCollection.Add(new CustomClass() { Number = 1, Text = "a" }); this.CustomCollection.Add(new CustomClass() { Number = 2, Text = "b" }); this.CustomCollection.Add(new CustomClass() { Number = 3, Text = "c" }); this.listView.ItemsSource = this.CustomCollection; this.customControl.Custom = new CustomClass() { Number = 0, Text = "customControl" }; } }
CustomControl.xaml
CustomControl.cs
public partial class CustomControl : UserControl { public static readonly DependencyProperty CustomObjectProperty; public static readonly DependencyProperty CustomTextProperty; static CustomControl() { CustomObjectProperty = DependencyProperty.Register("CustomObject", typeof(CustomClass), typeof(CustomControl), new PropertyMetadata(default(CustomClass), OnCustomObjectPropertyChanged)); CustomTextProperty = DependencyProperty.Register("CustomText", typeof(string), typeof(CustomControl), new PropertyMetadata(string.Empty, OnCustomTextPropertyChanged)); } public CustomControl() { InitializeComponent(); this.DataContext = this; } public CustomClass CustomObject { get { return (CustomClass)(this.GetValue(CustomObjectProperty)); } set { this.SetValue(CustomObjectProperty, value); } } public string CustomText { get { return (string)(this.GetValue(CustomTextProperty)); } set { this.SetValue(CustomTextProperty, value); } } private static void OnCustomObjectPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { } private static void OnCustomTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { } }
CustomClass.cs
public class CustomClass : INotifyPropertyChanged { private int number; private string text; public CustomClass() { this.number = new int(); this.text = string.Empty; } public int Number { get { return this.number; } set { this.number = value; this.OnPropertyChanged(); } } public string Text { get { return this.text; } set { this.text = value; this.OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string name = null) { PropertyChangedEventHandler handler = this.PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(name)); } } }
将UserControl的DataContext
设置为UserControl实例,如
this.DataContext = this;
有效地防止绑定到“外部”,inheritance的DataContext,如期望的那样
作为一般规则, 永远不要显式设置UserControl的DataContext。 从UserControl的构造函数中删除上面的行,并使用RelativeSource在UserControl的XAML中编写绑定: