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中编写绑定: