UWP 用户控件:绑定依赖项的集合更改事件 属性
UWP User control: collection changed event of a binded dependency property
当我调用 Generate()
时,与 ObservableCollection (X
) 关联的事件未被触发。
我做错了什么?
代码:
MyControl.xaml.cs
public ObservableCollection<double> X
{
get { return (ObservableCollection<double>)GetValue(XProperty); }
set { SetValue(XProperty, value); }
}
public static readonly DependencyProperty XProperty =
DependencyProperty.Register(
"X", typeof(ObservableCollection<double>),
typeof(MyControl),
new PropertyMetadata(
new ObservableCollection<double>(),
new PropertyChangedCallback(OnXChanged)));
private static void OnXChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var control = sender as MyControl;
// DoSomething
}
A XAML random page that uses MyControl:
<local:MyControl
Title="Test"
X="{Binding TestX, Mode=TwoWay}"
/>
That page's .cs
public sealed partial class MainPage : Page
{
public ObservableCollection<double> TestX { get; set; }
private static Random rand_ = new Random();
public MainPage()
{
this.InitializeComponent();
TestX = new ObservableCollection<double>();
}
private void Generate()
{
TestX.Clear();
for (int i = 0; i < 100; ++i)
{
TestX.Add(rand_.Next(1, 100));
}
}
....
}
请注意,我在输出中没有看到任何 BindingExpression 错误 window。
更新
我注意到如果在页面中这样做,它会起作用:
TestX = new ObservableCollection<double>();
this.MyUserControlInstance.X = TestX;
你遗漏了两件事:
第一个:
确保在构造函数中设置 DataContext
:
public MainPage()
{
this.InitializeComponent();
DataContext = this; // Important, but you should use a seperated ViewModel instead
TestX = new ObservableCollection<double>();
}
第二个:
您的 class 缺少 INotifyPropertyChanged
实现,以及对您的 TestX
属性:
的 PropertyChanged
调用
private ObservableCollection<double> _testX;
public ObservableCollection<double> TestX
{
get { return _testX; }
set
{
if (value == _testX) return;
_testX = value;
OnPropertyChanged();
}
}
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
旁注:做 MVVM!
当我调用 Generate()
时,与 ObservableCollection (X
) 关联的事件未被触发。
我做错了什么?
代码:
MyControl.xaml.cs
public ObservableCollection<double> X
{
get { return (ObservableCollection<double>)GetValue(XProperty); }
set { SetValue(XProperty, value); }
}
public static readonly DependencyProperty XProperty =
DependencyProperty.Register(
"X", typeof(ObservableCollection<double>),
typeof(MyControl),
new PropertyMetadata(
new ObservableCollection<double>(),
new PropertyChangedCallback(OnXChanged)));
private static void OnXChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var control = sender as MyControl;
// DoSomething
}
A XAML random page that uses MyControl:
<local:MyControl
Title="Test"
X="{Binding TestX, Mode=TwoWay}"
/>
That page's .cs
public sealed partial class MainPage : Page
{
public ObservableCollection<double> TestX { get; set; }
private static Random rand_ = new Random();
public MainPage()
{
this.InitializeComponent();
TestX = new ObservableCollection<double>();
}
private void Generate()
{
TestX.Clear();
for (int i = 0; i < 100; ++i)
{
TestX.Add(rand_.Next(1, 100));
}
}
....
}
请注意,我在输出中没有看到任何 BindingExpression 错误 window。
更新
我注意到如果在页面中这样做,它会起作用:
TestX = new ObservableCollection<double>();
this.MyUserControlInstance.X = TestX;
你遗漏了两件事:
第一个:
确保在构造函数中设置 DataContext
:
public MainPage()
{
this.InitializeComponent();
DataContext = this; // Important, but you should use a seperated ViewModel instead
TestX = new ObservableCollection<double>();
}
第二个:
您的 class 缺少 INotifyPropertyChanged
实现,以及对您的 TestX
属性:
PropertyChanged
调用
private ObservableCollection<double> _testX;
public ObservableCollection<double> TestX
{
get { return _testX; }
set
{
if (value == _testX) return;
_testX = value;
OnPropertyChanged();
}
}
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
旁注:做 MVVM!