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
       }
}