是否可以将模型用作自定义控件的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属性则不行。
答案 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因此它不会更新