gpt4 book ai didi

c# - 在 wpf 中绑定(bind)模型的通用属性

转载 作者:行者123 更新时间:2023-12-03 10:26:54 25 4
gpt4 key购买 nike

我有一个 wpf 用户控件,它绑定(bind)到一个模型(CustomerTaxModel),它有一个 ListView 和 GridView,它应该显示下面“T” Assets 类型的属性数据。这种类型 T 是一个只有属性的类,它具有可变数量的属性,具体取决于我们从第三方税务验证公司收到的数据。

public class CustomerTaxModel

{

public int ID { get; set; }

public string Name { get; set; }

public T Assets { get; set; }


}

我的通用类型“T”类如下所示。它们可能没有匹配的属性。我应该显示这种类型 T 的数据,其中一列中的属性名称和第二列中的值。可以在 xaml 中进行这种类型的绑定(bind)吗? T 类型采用 CorporateAsset 、 AgricultureReturns 等。
public class CorporateAsset
{

public string CorporateOfficeName { get; set; }

public string NetWorth { get; set; }

public string Subsidized { get; set; }

public string LaunchDate{ get; set; }

}


public class AgricultureReturns

{

public string Name { get; set; }

public string FieldSizeinAcres { get; set; }

public string CropType { get; set; }

public int NoOfSeasons { get; set; }

}

我尝试的一种解决方案是绑定(bind)到 KeyValuePair 变量,而不是直接绑定(bind)类型“T”。 .我提到了 link我尝试使用静态属性类代替类型 T 并动态显示数据,但是当属性本身是通用的时,我们如何在 GridView 中显示其属性。
<UserControl x:Class="WpfApplication1.UserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication1="clr-namespace:WpfApplication1"
mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignHeight="189" d:DesignWidth="312" Width="300" Height="300">
<UserControl.Resources>
<WpfApplication1:ConfigToDynamicGridViewConverter x:Key="ConfigToDynamicGridViewConverter" />
</UserControl.Resources>
<ListView ItemsSource="{Binding DataClass}" View="{Binding ColumnConfig, Converter={StaticResource ConfigToDynamicGridViewConverter}}"/>

最佳答案

Binding.Path通过反射(reflection)工作。它可以查找实际运行时对象具有的任何公共(public)实例属性。这就是 DataContext property的 WPF 控件的类型可以是 Object .您的 Assets就 WPF 而言,属性可以是对象,但没有理由放弃模型中的强类型。 WPF 什么都吃。

这给了我一个 TextBlock上面写着“弗雷德”:

public MainWindow()
{
InitializeComponent();

DataContext = new CustomerTaxModel<AgricultureReturns>()
{
Assets = new AgricultureReturns() { Name = "Fred" }
};

}

XAML:
<TextBlock Text="{Binding Assets.Name}" />

如果您有 ObservableCollectionCustomerTaxModel , 一个常见的模式是有一堆 DataTemplates对于 Assets 的不同类型可能。这些是相当蹩脚的模板,但你明白了。
<ItemsControl ItemsSource="{Binding TaxModels}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<!-- DataTemplates in Resources will be used here automagically -->
<ContentControl Content="{Binding Assets}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>

<ItemsControl.Resources>
<DataTemplate TargetType="{x:Type models:AgricultureReturns}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding FieldSizeinAcres}" />
<!-- etc -->
</StackPanel>
</DataTemplate>

<DataTemplate TargetType="{x:Type models:CorporateAsset}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding CorporateOfficeName}" />
<TextBlock Text="{Binding NetWorth}" />
<!-- etc -->
</StackPanel>
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>

关于c# - 在 wpf 中绑定(bind)模型的通用属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38881880/

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