【发布时间】:2015-12-05 16:03:00
【问题描述】:
当我调用 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
}
使用 MyControl 的 XAML 随机页面:
<local:MyControl
Title="Test"
X="{Binding TestX, Mode=TwoWay}"
/>
该页面的 .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 错误。
更新
我注意到如果在页面中这样做,它会起作用:
TestX = new ObservableCollection<double>();
this.MyUserControlInstance.X = TestX;
【问题讨论】:
-
你指的是哪个事件?
OnXChanged或ObservableCollection的CollectionChanged事件。 -
@Herdo OnXChanged。我注意到,使用我在问题末尾放入 Update 的代码,该事件将在运行开始时触发一次。我希望它也可以通过 XAML 中的绑定来触发
-
能否将
PropertyMetadata的默认值设置为null再试一次? -
您能否添加有关您在哪里初始化
Page的TestX属性以及在哪里设置Page的DataContext的代码? -
已更新。我没有为页面设置任何 DataContext。