C# UWP用户控件:绑定依赖项属性的集合更改事件

C# UWP用户控件:绑定依赖项属性的集合更改事件,c#,xaml,binding,uwp,C#,Xaml,Binding,Uwp,当我调用Generate()时,与ObservableCollection(X)关联的事件不会被触发 我做错了什么 守则: MyControl.xaml.cs 公共可观测集合X { 获取{return(observetecollection)GetValue(XProperty);} set{SetValue(XProperty,value);} } 公共静态只读从属属性XProperty= 从属属性。寄存器( “X”,类型(可观测采集), 类型(MyControl), 新属性元数据( 新的Ob

当我调用
Generate()
时,与ObservableCollection(
X
)关联的事件不会被触发

我做错了什么

守则:

MyControl.xaml.cs

公共可观测集合X
{
获取{return(observetecollection)GetValue(XProperty);}
set{SetValue(XProperty,value);}
}
公共静态只读从属属性XProperty=
从属属性。寄存器(
“X”,类型(可观测采集),
类型(MyControl),
新属性元数据(
新的ObservableCollection(),
新属性交换回拨(OnXChanged));
交换时私有静态无效(DependencyObject发送方,DependencyPropertyChangedEventArgs e)
{
var control=发送方作为MyControl;
//剂量
}
使用MyControl的XAML随机页面:


那一页是.cs

公共密封部分类主页面:第页
{
公共可观测集合TestX{get;set;}
私有静态随机rand_u2;=新随机();
公共主页()
{
this.InitializeComponent();
TestX=新的ObservableCollection();
}
私有void生成()
{
TestX.Clear();
对于(int i=0;i<100;++i)
{
Add(rand_.Next(1100));
}
}
....
}
请注意,我在输出窗口中没有看到任何BindingExpression错误

更新

我注意到,如果您在页面中这样做,它会起作用:

TestX = new ObservableCollection<double>();
this.MyUserControlInstance.X = TestX;
TestX=新的ObservableCollection();
this.MyUserControlInstance.X=TestX;

您缺少两件事:

第一:
确保在构造函数中设置了
DataContext

public MainPage()
{
    this.InitializeComponent();

    DataContext = this; // Important, but you should use a seperated ViewModel instead

    TestX = new ObservableCollection<double>();
} 

旁注:做MVVM

你指的是哪项活动
OnXChanged
observedcollection
CollectionChanged
事件。我注意到,我在问题末尾的Update中输入了代码,该事件将在运行开始时触发一次。我希望它也能在Xaml中绑定时启动。您能将
属性元数据的默认值设置为
null
并重试吗?请添加有关您在
页面
中初始化
TestX
属性的代码,好吗,以及设置该
页面
数据上下文
的位置。我没有为页面设置任何DataContext。
   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));
            }
        }
   ....
 }
TestX = new ObservableCollection<double>();
this.MyUserControlInstance.X = TestX;
public MainPage()
{
    this.InitializeComponent();

    DataContext = this; // Important, but you should use a seperated ViewModel instead

    TestX = new ObservableCollection<double>();
} 
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));
}