WPF 自定义控件,模型作为依赖项属性

本文关键字:依赖 属性 自定义控件 模型 WPF | 更新日期: 2023-09-27 18:36:38

是否可以将模型用作自定义控件的DependencyProperty?我想这样做是因为我想创建一个自定义控件,它基本上是一个图像抽屉,它获取名称和用于绘制的数据点列表。

像这样:

型:

public class Draw : NotificationObject
{
public Draw(string name, List<System.Drawing.PointF> data)
    {
        Name = name;
        Data = data;
    }
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            if (_name != value)
            {
                _name = value;
                RaisePropertyChanged(() => Name);
            }
        }
    }
    private List<System.Drawing.PointF> _data;
    public List<System.Drawing.PointF> Data
    {
        get { return _data; }
        set
        {
            if (_data != value)
            {
                _data = value;
                RaisePropertyChanged(() => Data);
            }
        }
    }
}
}

自定义控件:

public class MyCanvas: System.Windows.Controls.Image
{
   static void itemsChangedCallBack(DependencyObject property,
   DependencyPropertyChangedEventArgs args)
    {
        MyCanvas searchTextBox = (MyCanvas)property;
        Console.WriteLine("got update");
        searchTextBox.Items = (Draw)args.NewValue;
    }
   public static readonly DependencyProperty ItemsProperty =
   DependencyProperty.Register("Items",
   typeof(Draw),
   typeof(MyCanvas),new PropertyMetadata(new PropertyChangedCallback(itemsChangedCallBack)));
    public Draw Items
    {
        get { return (Draw)GetValue(ItemsProperty); }
        set { SetValue(ItemsProperty, value); }
    }
}

当然还有 XAML:

<myClass:MyCanvas x:Name="Canvas1" Items="{Binding drawModel,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SizX="1600" SizY="200" />

视图模型调用:

public class MainWindowViewModel : BaseViewModel
   {
   public Draw drawModel { get; set; }
   public MainWindowViewModel()
       {
           drawModel = new Draw("first", null); // custom control is notified
       }
   private someFunction() //within another thread but should not matter
       {
           drawModel.Data = newData; // custom control should be notified but is not
       }
}

我的问题是,如果我确实更改了视图模型中的drawModel.Data(属性),则不会收到自定义控件的通知。我之前为一个简单的字符串而不是模型做过,它奏效了。它在第一次初始化 drawModel 时有效,但如果我稍后更新 Data 属性,则不工作。

WPF 自定义控件,模型作为依赖项属性

它在第一次初始化 drawModel 时有效,但如果我稍后更新 Data 属性,则不工作。

您应该Data设为ObservableCollection<PointF>(或者,更好的是ObservableCollection<System.Windows.Point>,因为 WPF 的点已经支持浮点值)。

问题在于,添加、删除或更改List<T>不会向 WPF 提供任何形式的通知,说明情况已更改。 ObservableCollection<T>实现了INotifyCollectionChanged,这是INotifyPropertyChagned的集合版本。

请注意,这仍然不会触发您控制范围内的更新。 如果需要,您可以订阅Draw.DataCollectionChanged事件,以便在集合中收到更改的通知。

你的视图模型没有实现INotifiyPropertyChanged,这是你第一次在构造函数中设置属性drawModel,它将在UI完全创建之前调用,一旦UI被创建,加载时它将加载属性的当前值,但是当你再次更改该值时,你必须通知UI特定属性的值已更改。

如果您更改了类 Draw 中任何属性的值,它可能会被反映,因为它实现了INotifiyPropertyChanged,但是您更改了视图模型中的 drawModel 的值,这不会实现 INotifiyPropertyChanged 因此它不会更新