【问题标题】:WPF MVVM User ControlWPF MVVM 用户控制
【发布时间】:2013-06-18 02:13:17
【问题描述】:

我正在使用 MVVM 开发 WPF 应用程序。主窗口上有一个客户姓名组合框。选择客户后,我想显示其地址。

所以我创建了一个地址用户控件,并在控件后面的代码中添加了一个 DP:

public static DependencyProperty CustomerIdProperty = 
    DependencyProperty.Register("CustomerId", typeof(int), typeof(AddressView));

public int CustomerId
{
    get { return (int)GetValue(CustomerIdProperty); }
    set { SetValue(CustomerIdProperty, value);  }
}

接下来,在主窗口中,我将组合绑定到用户控件的 CustomerId DP:

<vw:AddressView Grid.Row="1"
                Grid.Column="0"
                x:Name="AddressList"
                CustomerId="{Binding ElementName=CustomersList, Path=SelectedCustomer.Id, Mode=TwoWay}"/>

我现在有一个问题和一个问题:

问题:当我运行它并选择一个客户时,DP 上的设置器永远不会触发。主窗口中的 SelectedCustomer 属性会触发,但不会触发用户控件中的 DP。

问题:控件的ViewModel如何知道DP中的CustomerId?

我在这里创建了一个小示例应用程序来演示我在做什么:

http://sdrv.ms/17OZv1x

我将不胜感激。

谢谢

【问题讨论】:

  • 如果依赖属性是通过绑定设置的,则不会调用 Get/Set,这只是为了在本地代码库中使用,如果需要检查它,可以将 PropertyChangedCallback 添加到 DependencyProperties MetaData正在分配
  • 好的,我明白了。但这仍然没有回答后面代码中 CustomerID 的值如何到达 ViewModel 的问题?
  • @kmarois:通过绑定系统。如果您想知道它是如何工作的 start here 并继续阅读。

标签: wpf mvvm user-controls


【解决方案1】:

当您的客户对象也具有地址属性时,您可以使用一种简单的方法来代替使用依赖属性

 <AdressView>
   <TextBlock Text="{Binding Path=MyAddress.Name}" />
   <TextBlock Text="{Binding Path=MyAddress.Street}" />

主窗口

  <ComboBox X:Name=cbo .../>
  <local:AddressView DataContext="{Binding ElementName=cbo, Path=SelectedItem}"/>

customer.cs

 public Address MyAddress {get;set;}

如果你想让你的依赖属性工作,你必须发布你的地址视图的代码,以便我们可以检查依赖属性的绑定,你必须提供一些信息,你想如何使用你的 customerid 获取地址.

【讨论】:

    【解决方案2】:

    CustomerList 的类型为 ComboBox,并且 ComboBox 没有 SelectedCustomer 属性。绑定所需的属性是SelectedItem您应该在 Visual Studio 中的调试会话期间遇到绑定错误。请参阅输出窗口

    要使其正常工作,您需要将 CustomerId-Property 的绑定更新为以下内容。

    CustomerId="{Binding ElementName=CustomersList, Path=SelectedItem.Id}"
    

    TwoWay-Binding 仅在您想从 AddressView 更改 Id 时才相关。我认为你不想要它。所以它可以被删除。

    【讨论】:

    • Combo 绑定到 List,其 SelectedItem 属性绑定到 SelectedCustomer 属性,这两个属性都在 VM 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多