WPF 自定义控件,模型作为依赖项属性
本文关键字:依赖 属性 自定义控件 模型 WPF | 更新日期: 2023-09-27 18:36:38
是否可以将模型用作自定义控件的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" />
视图模型调用:
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
}
}
我的问题是,如果我确实更改了视图模型中的drawModel.Data(属性),则不会收到自定义控件的通知。我之前为一个简单的字符串而不是模型做过,它奏效了。它在第一次初始化 drawModel 时有效,但如果我稍后更新 Data 属性,则不工作。
它在第一次初始化 drawModel 时有效,但如果我稍后更新 Data 属性,则不工作。
您应该Data
设为ObservableCollection<PointF>
(或者,更好的是ObservableCollection<System.Windows.Point>
,因为 WPF 的点已经支持浮点值)。
问题在于,添加、删除或更改List<T>
不会向 WPF 提供任何形式的通知,说明情况已更改。 ObservableCollection<T>
实现了INotifyCollectionChanged
,这是INotifyPropertyChagned
的集合版本。
请注意,这仍然不会触发您控制范围内的更新。 如果需要,您可以订阅Draw.Data
的CollectionChanged
事件,以便在集合中收到更改的通知。
你的视图模型没有实现INotifiyPropertyChanged
,这是你第一次在构造函数中设置属性drawModel,它将在UI完全创建之前调用,一旦UI被创建,加载时它将加载属性的当前值,但是当你再次更改该值时,你必须通知UI特定属性的值已更改。
如果您更改了类 Draw 中任何属性的值,它可能会被反映,因为它实现了INotifiyPropertyChanged
,但是您更改了视图模型中的 drawModel 的值,这不会实现 INotifiyPropertyChanged 因此它不会更新