【问题标题】:UWP User control: collection changed event of a binded dependency propertyUWP 用户控件:绑定的依赖属性的集合更改事件
【发布时间】: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;

【问题讨论】:

  • 你指的是哪个事件? OnXChangedObservableCollectionCollectionChanged 事件。
  • @Herdo OnXChanged。我注意到,使用我在问题末尾放入 Update 的代码,该事件将在运行开始时触发一次。我希望它也可以通过 XAML 中的绑定来触发
  • 能否将PropertyMetadata的默认值设置为null再试一次?
  • 您能否添加有关您在哪里初始化PageTestX 属性以及在哪里设置PageDataContext 的代码?
  • 已更新。我没有为页面设置任何 DataContext。

标签: c# xaml binding uwp


【解决方案1】:

你错过了两件事:

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

public MainPage()
{
    this.InitializeComponent();

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

    TestX = new ObservableCollection<double>();
} 

第二:
您的课程缺少 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!

【讨论】:

    猜你喜欢
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多