Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的ViewModel应该从DependencyObject继承吗?_C#_Wpf_Xaml_Uwp - Fatal编程技术网

C# 我的ViewModel应该从DependencyObject继承吗?

C# 我的ViewModel应该从DependencyObject继承吗?,c#,wpf,xaml,uwp,C#,Wpf,Xaml,Uwp,好的,基本上我的目标是在代码中设置绑定,而不是使用XAML。 源属性是一个自定义的依赖项属性,它是一个字符串。目标属性位于ViewModel中,它也是一个字符串,但它不是依赖性属性(因为ViewModel当然不是DependencyObject) 因此,目标属性只是一个字符串属性(我们将此属性称为MyTextProperty) 这种绑定方法是通过XAML实现的(到目前为止只在x:bind中尝试过),但我似乎无法用纯C实现这一点 BindingOperations.SetBinding()希望目标

好的,基本上我的目标是在代码中设置绑定,而不是使用XAML。 源属性是一个自定义的依赖项属性,它是一个字符串。目标属性位于ViewModel中,它也是一个字符串,但它不是依赖性属性(因为ViewModel当然不是DependencyObject)

因此,目标属性只是一个字符串属性(我们将此属性称为MyTextProperty)

这种绑定方法是通过XAML实现的(到目前为止只在x:bind中尝试过),但我似乎无法用纯C实现这一点

BindingOperations.SetBinding()希望目标是依赖属性,但MyTextProperty只是位于我的ViewModel中的一个简单字符串属性


我只是想知道是否有办法让这一切顺利进行。我的ViewModel是否需要是DependencyObject?虽然我从未尝试过,但如果是的话,它似乎会起作用。这种做法是否被视为一种良好的模式/做法?任何帮助都将不胜感激。谢谢。

一个可能的解决方案是使用单向源或双向绑定创建绑定。通过这种方式,可以绑定到控件的DependencyProperty和viewmodel中的“normal”属性。一种可能的解决方案是使用单向ToSource或双向绑定创建绑定。这样就可以绑定到控件的DependencyProperty和viewmodel中的“normal”属性

我的ViewModel应该从DependencyObject继承吗

我的ViewModel是否需要是DependencyObject

否和否。它不应作为国家:

  • DependencyObjects未标记为可序列化

  • DependencyObject类重写并密封Equals()和GetHashCode()方法

  • DependencyObject具有线程关联性-只能在创建它的线程上访问它

  • 我倾向于创建一个
    UserControl
    ,并在那里公开依赖项属性。您可以覆盖OnxxxPropertyChanged以让视图模型知道更改

    使用这种方法,您的控件将以WPF设计的方式参与依赖项属性通信

    考虑到您已经在考虑使用DependencyProperties,告诉我您有一个想要设置控件属性的异物,并且没有访问基础viewmodel的权限。DPs非常适合这样做

    否则,如果我们只是简单地讨论视图背后的代码,那么您只需直接与视图模型对话,然后就可以使用它了

    我的ViewModel应该从DependencyObject继承吗

    我的ViewModel是否需要是DependencyObject

    否和否。它不应作为国家:

  • DependencyObjects未标记为可序列化

  • DependencyObject类重写并密封Equals()和GetHashCode()方法

  • DependencyObject具有线程关联性-只能在创建它的线程上访问它

  • 我倾向于创建一个
    UserControl
    ,并在那里公开依赖项属性。您可以覆盖OnxxxPropertyChanged以让视图模型知道更改

    使用这种方法,您的控件将以WPF设计的方式参与依赖项属性通信

    考虑到您已经在考虑使用DependencyProperties,告诉我您有一个想要设置控件属性的异物,并且没有访问基础viewmodel的权限。DPs非常适合这样做

    否则,如果我们只是简单地讨论视图背后的代码,那么您只需直接与视图模型对话,然后就可以使用它了

    BindingOperations.SetBinding()希望目标是依赖属性,但MyTextProperty只是位于我的ViewModel中的一个简单字符串属性

    您误解了绑定目标和绑定源:预期的目标依赖项属性是visual XAML控件的属性(即
    Text
    控件的
    TextBlock
    属性)。视图模型属性
    MyTextProperty
    是绑定的源

    因此,不需要,视图模型不需要从
    DependencyObject
    继承

    下面介绍如何通过代码配置绑定

    但是,这样做,您将不得不在视图模型中引用您的可视控件,这是一种糟糕的做法

    BindingOperations.SetBinding()希望目标是依赖属性,但MyTextProperty只是位于我的ViewModel中的一个简单字符串属性

    您误解了绑定目标和绑定源:预期的目标依赖项属性是visual XAML控件的属性(即
    Text
    控件的
    TextBlock
    属性)。视图模型属性
    MyTextProperty
    是绑定的源

    因此,不需要,视图模型不需要从
    DependencyObject
    继承

    下面介绍如何通过代码配置绑定


    但是,这样做,您将不得不在视图模型中引用您的视觉控件,这是一种糟糕的做法。

    我想知道这一点。但它必须是用户控件吗?我对复杂的DependencyObject没有什么经验,但是创建一个类并让该类从DependencyObject继承,而不是创建一个完整的UserControl(我猜它包含一个毫无意义的.xaml文件),不是更简单吗?然后将属性放在该类中并从那里开始…@JonathanAcinity通常,如果您使用的是
    DependencyObject
    s,这意味着其他控件/窗口正在引用它,否则您只需与底层视图模型对话。创建
    UserControl
    非常简单。顺便说一下,我不是说嵌入什么-