我有一个wpf usercontrol,它绑定到一个模型(CustomerTaxModel),它有一个listview和GridView,它应该显示下面类型为“T”的属性的数据。此类型T是仅具有属性的类,并且根据我们从第三方税务验证公司收到的数据,它具有可变数量的属性。
public class CustomerTaxModel
{
public int ID { get; set; }
public string Name { get; set; }
public T Assets { get; set; }
}
我的通用类型“T”类如下所示。它们可能没有匹配的属性。我应该显示这种类型T的数据,其中属性名称在一列中,它们的值在第二列中。在xaml中可以做这种类型的绑定吗? 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; }
}
我尝试过的一个解决方案是绑定到KeyValuePair变量,而不是直接绑定类型“T”。我引用了link,我尝试使用静态属性类代替类型T,它动态显示数据,但当属性本身是通用的时,我们如何在网格视图中显示其属性。
<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}}"/>
答案 0 :(得分:2)
Binding.Path
通过反思来运作。它可以查找实际运行时对象具有的任何公共实例属性。这就是DataContext
property WPF控件的类型Object
的方式。您的Assets
属性可能是WPF的对象,但是没有理由放弃模型中的强类型。 WPF吃任何东西。
这给了我一个TextBlock
,表示&#34; Fred&#34;:
public MainWindow()
{
InitializeComponent();
DataContext = new CustomerTaxModel<AgricultureReturns>()
{
Assets = new AgricultureReturns() { Name = "Fred" }
};
}
XAML:
<TextBlock Text="{Binding Assets.Name}" />
如果您有ObservableCollection
CustomerTaxModel
,则常见的模式是为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>