【问题标题】:How to correctly bind a DependencyProperty of a UserControl to a property of its own view model?如何正确地将 UserControl 的 DependencyProperty 绑定到其自己的视图模型的属性?
【发布时间】:2017-07-06 09:33:04
【问题描述】:

编辑:将视图模型设置为DataContext

这里有很多关于 SO 的问题,但它们都围绕着做一些时髦的 CodeBehind 东西。我想要的是:

我有一个这样的视图模型:

public class FooViewModel : INotifyPropertyChanged {

    public Foo Foo {
        get { ...}
        set { ... }
    }    
}

我在我的 UserControl 中这样定义:

<UserControl.DataContext>
    <vm:FooViewModel />
</UserControl.DataContext>

在我的 CodeBehind 文件中,我定义了一个 DependencyProperty:

    public Foo Foo {
        get { return (Foo)GetValue(FooProperty); }
        set { SetValue(FooProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Foo.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty FooProperty =
        DependencyProperty.Register("Foo", typeof(Foo), typeof(FooControl), new PropertyMetadata(null));

所以我现在可以在其他地方使用控件时绑定Foo 属性。

缺少的链接是:如何将 UserControl 的 Foo 绑定到 ViewModel 的 Foo?

目前,我在 CodeBehind 中使用了一些复杂的事件处理来同步这些,但我认为 XAML 中必须有一种方法可以做到这一点,还是没有?

【问题讨论】:

  • 所以你的视图模型不是你控制的DataContext?
  • 如果我将其设为DataContext,我该如何将其绑定到依赖属性?
  • 用户控件不应该有自己的视图模型。相反,它应该在其父控件或窗口的继承 DataContext 中对视图模型进行操作。
  • 那么我应该如何做一个独立的用户控件呢?我真的应该用DependencyProperties 定义代码隐藏中的所有内容并在那里执行逻辑吗?
  • 您没有告诉过您想对 Foo 依赖项属性做什么,但通常您会将 UserControl 的 XAML 中的控件属性绑定到该属性。您可以通过使用 RelativeSource 绑定来做到这一点,例如&lt;Label Content="{Binding Foo, RelativeSource={RelativeSource AncestorType=UserControl}}" /&gt;

标签: c# wpf xaml user-controls


【解决方案1】:

如果您真的想这样做 - 您可以使用样式(当视图模型在资源中时,我使用的是您的原始代码):

<UserControl.Resources>
    <local:ViewModel x:Key="ViewModel" />
    <Style TargetType="local:MyUserControl">
        <Setter Property="Foo"
                Value="{Binding Source={StaticResource ViewModel}, Path=Foo}" />
    </Style>
</UserControl.Resources>

但是,拥有UserControl 的视图模型并不是一个好主意。使用依赖属性并直接从UserControl 中的控件绑定到它们。然后当你使用UserControl - 你将能够从外部绑定它的依赖属性。然而,从内部绑定它们(以分离视图模型)通常不是一个好主意。

【讨论】:

  • 啊,好的。感谢您的澄清。正如我在另一条评论中所说,我想做的是:推入用户控件的Foo 应该填充用户控件内的几个控件。有一些控件的值“计算”Foo 的一个值。例如,Nullable&lt;DateTime&gt; 应该传播到两个控件:一个复选框和一个用于编辑DateTime 的控件。如果复选框被选中,DateTime? 应该有另一个控件的值,如果没有,它应该是null。
  • 我同意 Clemens cmets 在这方面的看法。总而言之,我想我回答了您关于如何在 xaml 中绑定用户控件的依赖属性的原始问题。
猜你喜欢
  • 2012-06-06
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 2020-06-16
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多