UserControl用于不同的数据对象

时间:2015-03-26 07:18:58

标签: c# wpf user-controls

假设我的模型文件夹中有以下两个类:

public class Simple
{
    public int Id { get; set; }

    public string Display { get; set; }

    public double Value1 { get; set; }
}

public class Extended : Simple
{
    public double Value2 { get; set; }

    public string Name { get; set; }
}

要显示Simple的集合,我创建了UserControl,如下所示:

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}"
         CanUserAddRows="False" CanUserDeleteRows="False">
   <DataGrid.Resources>
       <Style TargetType="{x:Type TextBlock}">
           <Setter Property="Margin" Value="4,2"/>
           <Setter Property="VerticalAlignment" Value="Center"/>
       </Style>
   </DataGrid.Resources>
   <DataGrid.Columns>
       <DataGridTemplateColumn Header="Id" Width="Auto" SortMemberPath="Id">
           <DataGridTemplateColumn.CellTemplate>
               <DataTemplate>
                   <TextBlock Text="{Binding Id}"/>
               </DataTemplate>
           </DataGridTemplateColumn.CellTemplate>
       </DataGridTemplateColumn>
       <DataGridTemplateColumn Header="Display" Width="*" SortMemberPath="Display">
           <DataGridTemplateColumn.CellTemplate>
               <DataTemplate>
                   <TextBlock Text="{Binding Display}"/>
               </DataTemplate>
           </DataGridTemplateColumn.CellTemplate>
       </DataGridTemplateColumn>
       <DataGridTemplateColumn Header="Value1" Width="*" SortMemberPath="Value1">
           <DataGridTemplateColumn.CellTemplate>
               <DataTemplate>
                   <TextBlock Text="{Binding Value1}"/>
               </DataTemplate>
           </DataGridTemplateColumn.CellTemplate>
       </DataGridTemplateColumn>
   </DataGrid.Columns>
</DataGrid>

UserControl的用法如下:

<local:SEControl DataContext="{Binding Simples}"/>

现在我要显示Extended - 对象的集合。我的方法现在是编写另一个UserControl,其中只有两列比另一列多。

我现在的问题是:有没有办法只编写一个UserControl来处理SimpleExtended

我还考虑过DataTemplate,但我必须复制逻辑。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用“可见性”。

在此处添加扩展列:

   <DataGridTemplateColumn Visibility="{Binding IsExtended, Converter={StaticResource BoolToVis}, FallbackValue=Hidden}" Header="Test" Width="*" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Test}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

并使用转换器,您可以在需要显示或不显示这些列时进行切换。 因此,当您更改ItemSource以包含扩展项时,也将IsExtended属性更改为true,反之亦然。