【问题标题】:Binding Dependency Property to View Model将依赖属性绑定到视图模型
【发布时间】:2015-06-23 13:43:27
【问题描述】:

我有两个定义如下的用户控件:

用户控制 1

XAML

<UserControl x:Class="TestBindings.UserControlOne"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:TestBindings">

    <UserControl.DataContext>
        <local:UserControlOneViewModel/>
    </UserControl.DataContext>


    <StackPanel>
        <TextBlock Text="{Binding MyProperty}"/>
        <local:UserControlTwo PropertyTwo="{Binding DataContext.MyProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>
    </StackPanel>   


</UserControl>

代码背后

    public partial class UserControlOne : UserControl
       {
          public UserControlOne()
          {
             InitializeComponent();
          }
       }

用户控制 2

XAML

    <UserControl x:Class="TestBindings.UserControlTwo"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:TestBindings">

        <UserControl.DataContext>
            <local:UserControlTwoViewModel/>
        </UserControl.DataContext>

        <TextBlock Name="TextBlock" Text="{Binding PropertyTwo}"/>

    </UserControl>

代码背后

public partial class UserControlTwo : UserControl
   {
      public static readonly DependencyProperty PropertyTwoProperty =
         DependencyProperty.Register("PropertyTwo", typeof (string), typeof (UserControlTwo),
            new FrameworkPropertyMetadata("Default", OnPropertyTwoChanged));

      public UserControlTwo()
      {
         InitializeComponent();

         var propertyTwoBinding = new Binding("PropertyTwo") {Mode = BindingMode.TwoWay};
         SetBinding(PropertyTwoProperty, propertyTwoBinding);
      }

      public string PropertyTwo
      {
         get { return (string) GetValue(PropertyTwoProperty); }
         set { SetValue(PropertyTwoProperty, value); }
      }

      private static void OnPropertyTwoChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
      {
         var userControlTwo = (UserControlTwo) d;
         userControlTwo.PropertyTwo = (string) e.NewValue;
      }
   }

在 UserControlTwo 的构造函数中,我将依赖属性 PropertyTwoProperty 绑定到关联 ViewModel 中的属性。我最终想将它绑定到 UserControlOne 的 ViewModel 中的一个属性,因此 UserControlOne xaml

<local:UserControlTwo PropertyTwo="{Binding DataContext.MyProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>

但是,这似乎永远不会成立。有什么想法我可能会出错吗?

【问题讨论】:

  • 我不明白。如果要在UserControlOne中将UserControlTwo.PropertyTwo绑定到DataContext的MyProperty,只需&lt;local:UserControlTwo PropertyTwo="{Binding MyProperty}"/&gt;即可。 UserControlTwo的构造函数中无需调用SetBinding。
  • 我认为您甚至不需要相对源,只需 PropertyTwo="{Binding MyProperty} 就可以了。您已经获得了数据上下文,无需指定它
  • 此外,OnPropertyTwoChanged 回调没有意义。它将PropertyTwo(再次)设置为它刚刚获得的值(这就是调用 PropertyChanged 的​​原因)。
  • @Clemens 我想在 UserControlTwo 的 ViewModel 中为 UserControlTwo 做一些视图逻辑,因此如何在 xaml 中设置绑定但在 UserControlTwo 的 ViewModel 中获取该属性
  • 简单地说,如何将自定义控件的依赖属性“连接”到其 ViewModel 中的属性

标签: wpf binding dependency-properties


【解决方案1】:

我认为您正在尝试将 UserControlOne 的数据上下文中的属性传递给 UserControlTwo 中的 DependencyProperty。

在这种情况下,您可以使用以下方法,并在您的 UserControl2 构造函数中删除代码中的 setbinding。让我知道这是否是您正在寻找的。​​p>

    <UserControl x:Class="TestBindings.UserControlOne"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Name="userControl"
    xmlns:local="clr-namespace:TestBindings">

        <UserControl.DataContext>
            <local:UserControlOneViewModel/>
        </UserControl.DataContext>


        <StackPanel>
            <TextBlock Text="{Binding MyProperty}"/>
            <local:UserControlTwo PropertyTwo="{Binding DataContext.MyProperty, ElementName=userControl,Mode=TwoWay}"/>
        </StackPanel>   


    </UserControl>

【讨论】:

  • 可以,但是我还需要访问UserControlTwo的ViewModel中UserControlTwo的DependencyProperty
  • @JamesB 如果您知道它是什么视图模型,那么在您的 OnPropertyTwoChanged 方法中,将 datacontext 转换为 VM 并更新其属性。
  • 如何在静态方法中获取数据上下文?
  • 你可以通过 var vm = userControlTwo.DataContext as VM;然后你可以做 vm.YourProperty = e.NewValue.ToString();
猜你喜欢
  • 2012-04-13
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多