C# WPF自定义控件,模型作为依赖项属性
是否可以将模型用作自定义控件的C# WPF自定义控件,模型作为依赖项属性,c#,wpf,mvvm,dependency-properties,C#,Wpf,Mvvm,Dependency Properties,是否可以将模型用作自定义控件的从属属性?我之所以要这样做,是因为我想创建一个自定义控件,它基本上是一个图像抽屉,用于获取用于绘制的名称和数据点列表 大概是这样的: 型号: public class Draw : NotificationObject { public Draw(string name, List<System.Drawing.PointF> data) { Name = name; Data = data; }
从属属性
?我之所以要这样做,是因为我想创建一个自定义控件,它基本上是一个图像抽屉,用于获取用于绘制的名称和数据点列表
大概是这样的:
型号:
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);
}
}
}
}
}
当然还有XAML:
<myClass:MyCanvas x:Name="Canvas1" Items="{Binding drawModel,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SizX="1600" SizY="200" />
我的问题是,如果我在ViewModel中更改drawModel.Data(属性),则不会收到对自定义控件的通知。我以前做过一个简单的字符串,而不是模型,它工作得很好。它在drawModel第一次初始化时起作用,但如果稍后更新数据属性,则不会起作用 您的视图模型没有实现
InotifyPropertyChanged
,这是您第一次在构造函数中设置属性drawModel,它将在完全创建UI之前和创建UI之后调用,加载时将加载属性的当前值,但是,当您再次更改该值时,您必须通知UI特定属性的值已更改
如果您更改了Draw类中任何属性的值,则可能会反映出来,因为该类实现了INotifiyPropertyChanged
,但是您更改的drawModel的值是在视图模型中,而这并不影响;无法实现InotifyPropertyChanged,因此不会更新
它在drawModel第一次初始化时起作用,但如果稍后更新数据属性,则不会起作用
您应该将数据
设置为可观察集合
(或者更好的设置为可观察集合
,因为WPF已经支持浮点值)
问题在于,添加、删除或更改列表
并不能向WPF提供任何形式的通知,表明事情已经发生了变化ObservableCollection
实现了INotifyCollectionChanged
,它是INotifyPropertyChagned
的集合版本
请注意,这仍然不会触发控件内的更新。如果需要,您可以订阅
Draw.Data
的CollectionChanged
事件,以通知集合中的更改。是的,可能。。。你的代码有问题吗?是的,这是可能的,而且你的代码看起来很好。只有typeof(DPFCanvas)应该是typeof(MyCanvas),如果你想在绑定中反映更新,你需要在模型类上实现INotifyPropertyChanged
。我使用的是NotificationObject。我现在在帖子中添加了这个,因为我之前忽略了它,因为我认为这是显而易见的,否则我永远不会得到任何通知。知道吗?问题还没解决。有人能帮我弄清楚为什么它不工作吗?NotificationObject是通过BaseViewModel实现的。抱歉,我现在添加了更多代码。正如我所说的,所有东西都会收到通知,只有自定义控件才会收到一次。我是否还需要在自定义控件中实现NotificationObject/INotifiyPropertyChanged?BaseViewModel是否要求INotifiyPropertyChanged?如果需要,请在drawModel setter的setter中调用RaisePropertyChanged。如果BaseViewModel未实现INotifyPropertyChanged,则在MainWindowViewModel中实现该模型和MainViewModel将实现INotifyPropertyChanged。如果我更改drawModel.Data属性,我可以看到MainViewModel和视图中的更改。未通知自定义控件。我应该提供源代码吗?您的数据是List类型,而不是List将其更改为observablecollection,因为列表未实现INotifyPropertyChanged,其中作为observablecollection实现当您更改数据的值时,会在类Draw not Custom控件中收到通知,因为数据是Draw not Custom控件的属性
<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
}
}