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

时间:2013-10-23 14:51:52

标签: c# wpf mvvm dependency-properties

是否可以将模型用作自定义控件的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" />

ViewModel调用:

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

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

2 个答案:

答案 0 :(得分:2)

  

第一次初始化drawModel时它会起作用,但是如果我稍后更新Data属性则不行。

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

问题是,添加,删除或更改List<T>并不会向WPF提供任何形式的通知已发生变化。 ObservableCollection<T>实现INotifyCollectionChanged,这是INotifyPropertyChagned的集合版本。

请注意,这仍然不会在您的控件中触发更新。如果您需要,可以订阅Draw.Data的{​​{1}}活动,以便收集有关收集的更改。

答案 1 :(得分:0)

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

如果您更改了类Draw中的任何属性的值,那么它可能已经被反映,因为它实现了INotifiyPropertyChanged,但是您更改了viewMode中的drawModel的值而这并不是; t实现INotifiyPropertyChanged因此它不会更新