gpt4 book ai didi

c# - 在 WPF 中创建可重用的用户控件

转载 作者:行者123 更新时间:2023-11-30 20:03:36 24 4
gpt4 key购买 nike

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

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 {...}
/*
...
*/
}

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

在设计用于编辑客户详细信息的 View (可能是另一个自定义用户控件)中,我们想放置一个这样的自定义控件

<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>

我们可以在绑定(bind)到 CustomerViewModel 实例的 View 中像这样简单地使用

 <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}" />

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

提前感谢您的贡献,

最佳答案

是的,这应该非常简单,要么使用 DataTemplate 创建一个无外观的控件,要么只创建一个标准的 UserControl。欺骗它以将其 DataContext 设置为完整的 Address 对象

<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>

关于c# - 在 WPF 中创建可重用的用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14627256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com