ItemsControl包含2个数据模板(每个对象一个)

时间:2016-02-14 19:57:13

标签: c# wpf mvvm data-binding

我正在使用MVVM处理WPF应用程序。 在我的ViewModel中,我有2个ObservableCollection个对象,我希望以不同的方式显示每个对象。 该集合属于同一类型 - <Record>。 以下是我展示一个系列的方法:

<ItemsControl ItemsSource="{Binding SquareRecordsToDisplay}" Margin="10,35,10,70.667" >
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid Background="#FFECCCCC">
                <TextBlock Text="{Binding Name}" />
                <TextBlock Text="{Binding DateString}" Margin="0, 15, 0, 0"/>
                <Image Source="{Binding Icon}" Width="20" Height="20" Margin="0, 30, 0, 0"/>
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="Canvas.Left" Value="{Binding X}"/>
            <Setter Property="Canvas.Top" Value="{Binding Y}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>

有没有办法以不同的方式显示其中的两个,而不使用多个ItemsControl(即使用两个DataTemplates)?两者都具有相同的属性,因为它们属于同一类型。我在同一个DataTemplates中阅读了有关使用两个ItemControl的类似问题和答案,但他们在查看不同类型的对象时无法解决我的问题。

修改

我尝试使用DataTrigger,但它让我的GUI崩溃......我在这里做错了什么?

  <DataTemplate>
                <Grid>
                    <Grid.Triggers>
                        <DataTrigger Binding="{Binding ViewStyle}" Value="ViewStyle.Square">
                            <Setter Property="Grid.Background" Value="Grey" />
                        </DataTrigger>
                        <DataTrigger Binding="{Binding ViewStyle}" Value="ViewStyle.Round">
                            <Setter Property="Grid.Background" Value="Aqua" />
                        </DataTrigger>
                    </Grid.Triggers>
                    <TextBlock Text="{Binding Name}" />
                    <TextBlock Text="{Binding DateString}" Margin="0, 15, 0, 0"/>
                    <Image Source="{Binding Icon}" Width="20" Height="20" Margin="0, 30, 0, 0"/>
                </Grid>
            </DataTemplate>

(ViewStyle是一个枚举)

1 个答案:

答案 0 :(得分:1)

假设您有一个包含单个字段的简单记录,您希望使用该字段来控制选择哪个模板:

public class MyViewModel : ViewModelBase
{
    public Record[] Records {get; set;}

    public MyViewModel()
    {
        this.Records = new Record[] {
            new Record{Field = false},
            new Record{Field = true},
        };
    }
}

public class Record
{
    public bool Field { get; set; }
}

以下XAML将完成这项工作。它将Item模板设置为一个控件,该控件使用DataTrigger从两种样式中选择一种,具体取决于Field的值:

<ItemsControl ItemsSource="{Binding Records}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Control>
                <Control.Resources>
                    <ControlTemplate x:Key="StyleA">
                        <TextBlock Text="Style A" />
                    </ControlTemplate>
                    <ControlTemplate x:Key="StyleB">
                        <TextBlock Text="Style B" />
                    </ControlTemplate>
                </Control.Resources>
                <Control.Style>
                    <Style TargetType="{x:Type Control}">
                        <Setter Property="Template" Value="{StaticResource StyleA}"/>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Field}" Value="True">
                                <Setter Property="Template" Value="{StaticResource StyleB}"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Control.Style>
            </Control>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>