3

是否可以将模型用作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 (属性),我不会收到自定义控件的通知。我之前为一个简单的字符串而不是模型做过它并且它有效。它在第一次初始化 drawModel 时起作用,但如果我稍后更新 Data 属性则不起作用。

4

2 回答 2

2

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

您应该制作Data一个ObservableCollection<PointF>(或者,甚至更好,ObservableCollection<System.Windows.Point>因为 WPF 的Point已经支持浮点值)。

问题是添加、删除或更改 aList<T>不会向 WPF 提供任何形式的通知,表明事情已发生变化。 ObservableCollection<T>implements INotifyCollectionChanged,这是INotifyPropertyChagned.

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

于 2013-10-23T22:13:35.713 回答
0

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

如果您更改了 Draw 类中任何属性的值,它可能已经反映,因为它实现了INotifiyPropertyChanged,但是您更改了 view-model 中的 drawModel 的值并且这没有实现 INotifiyPropertyChanged 因此它不会更新

于 2013-10-23T15:37:49.533 回答