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));
}