2

在我们使用 WPF for UI 构建的(相当大的)LOB 应用程序中,我们有很多包含相同类型数据子对象的视图模型。比如有很多地址

public class AddressViewModel : INotifyPropertyChanged
{

   public string City {...}
   public string ZipCode {...}
   public string Address {...}
   public string Number {...}

  // INPC logic omitted 
}

分散在业务对象中:

public class CustomerViewModel : INotifyPropertyChanged
{
     public string Name {...}
     public AddressViewModel BillingAddress {...}
     public AddressViewModel DeliveryAddress {...}
     /*
     ...
     */
}

是否可以构建一个可重用的自定义用户控件,我们可以将其绑定到任何地址子对象?

在旨在编辑客户详细信息的视图(可能是另一个自定义用户控件)中,我们希望放置一个像这样的自定义控件

<UserControl x:Class="OurApp.View.AddressEditor"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>

        <TextBox x:Name="ZipCode" Text="{Binding Path=ZipCode, UpdateSourceTrigger = PropertyChanged}" Validation.ErrorTemplate="{x:Null}" HorizontalAlignment="Left" Height="23" Margin="10,19,0,0" TextWrapping="Wrap"  VerticalAlignment="Top" Width="120" />

         <!-- other fields for the rest of AddressViewModel properties-->

    </Grid>

</UserControl>

我们可以像这样在绑定到 CustomerViewModel 实例的视图中简单地使用

 <TextBox x:Name="Name" Text="{Binding Path=Name, UpdateSourceTrigger = PropertyChanged}" Validation.ErrorTemplate="{x:Null}" />

<AddressEditor SomeProperty="{something that points to BillingAddress}" />
<AddressEditor SomeProperty="{something that points to DeliveryAddress}" />

这样做的正确方法是什么?我们试图将绑定指向 BillingAddress,但我们没有找到可行的方法......

提前感谢您的任何贡献,

4

2 回答 2

8

是的,这应该很容易,要么创建一个无外观的控件DataTemplate,要么只创建一个标准的 UserControl。欺骗它以将其设置DataContext为完整的地址对象

<local:AddressControl DataContext="{Binding BillingAddress}"/>

这将允许您的新“AddressControl”具有类似这样的标记

<StackPanel Orientation="Vertical">
<Label Content="City"/>
<TextBox Content="{Binding City}"/>

<Label Content="ZipCode"/>
<TextBox Content="{Binding ZipCode}"/>

<Label Content="ZipCode"/>
<TextBox Content="{Binding ZipCode}"/>

<Label Content="Number"/>
<TextBox Content="{Binding Number}"/>
</StackPanel>
于 2013-01-31T13:54:17.147 回答
0

您可以将您的地址编辑器的数据上下文设置为例如。BillingAddress 只要 billingaddress 在用户控件中具有您需要的属性,它就应该可以工作

<TextBox x:Name="Name" Text="{Binding Path=Name, UpdateSourceTrigger = PropertyChanged}" Validation.ErrorTemplate="{x:Null}" />
<AddressEditor DataContext="{Binding Path=BillingAddress}" />

除了设置数据上下文之外,它还可以为您的用户控件创建一个依赖属性,您可以将您的 BillingAddress 绑定到该属性。

于 2013-01-31T13:51:54.547 回答