[英]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.Data
的CollectionChanged
事件,以便收集有关集合的更改。
您的视图模型没有实现INotifiyPropertyChanged
,这是您第一次在构造函数中设置属性drawModel,它将在完全创建UI之前调用,并且一旦创建了UI,并且在加载它时将加载当前值属性,但是当您再次更改该值时,您必须通知UI特定属性的值已更改。
如果你已经改变了类Draw中的任何属性的值,那么它可以被反射,因为它实现了INotifiyPropertyChanged
,但你改变了INotifiyPropertyChanged
的drawModel的值,并且没有实现INotifiyPropertyChanged因此它没有更新
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.