繁体   English   中英

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

[英]WPF custom control, model as dependency property

是否可以将模型用作自定义控件的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属性则不行。

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

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

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

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

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

如果你已经改变了类Draw中的任何属性的值,那么它可以被反射,因为它实现了INotifiyPropertyChanged ,但你改变了INotifiyPropertyChanged的drawModel的值,并且没有实现INotifiyPropertyChanged因此它没有更新

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM