单击按钮时切换listview的控件模板

时间:2014-12-08 17:33:48

标签: c# wpf controltemplate

单击按钮时,是否可以使用xaml设置listview的控件模板?

现在我知道如何在我选择ListViewItem时设置我的内容模板,而不是在列表视图之外的内容发生变化时如何更改我的控件模板。

点击相应按钮后,我想更改ListItemTemplate以使用RentTemplateBuyTemplate

    <Button x:Name="RentButton" />
    <Button x:Name="BuyButton" />

    <ListView Name="ItemsList">
        <ListView.Resources>
            <!-- unselected item template -->
            <DataTemplate x:Key="DefaultItemTemplate">
            </DataTemplate>
            <!-- selected item template -->
            <DataTemplate x:Key="SelectedItemTemplate">
            </DataTemplate>
            <DataTemplate x:Key="RentTemplate">
            </DataTemplate>
            <DataTemplate x:Key="BuyTemplate">
            </DataTemplate>
        </ListView.Resources>
        <ListView.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <!-- set properties for all items -->
                <Setter Property="ContentTemplate" Value="{StaticResource DefaultItemTemplate}" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="true">
                        <!-- change what the selected item looks like -->
                        <Setter Property="ContentTemplate" Value="{StaticResource SelectedItemTemplate}" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>

修改

我尝试使用DataTriggers来选择更改属性时使用的模板(当我点击我的按钮时,我会更改)。我不认为这种情况是理想的,但我不知道其他任何方式。

现在的问题是我似乎无法将Property触发器和DataTriggers混合在同一个MultiTrigger中。

我试图制作的场景如下: 如果我按BuyButton我想看BuyTemplateRentButtonRentTemplate相同。 但是当我按下第三个按钮OverviewButton时,我想在两个模板之间做出选择,具体取决于当前是否选择了ListBoxItem

或者我是否滥用DataTemplates和DataTriggers并且有更好的方法来实现这一目标吗?

<Window.Resources>
    <!-- unselected item template -->
    <DataTemplate x:Key="DefaultItemTemplate">
    </DataTemplate>
    <!-- selected item template -->
    <DataTemplate x:Key="SelectedItemTemplate">
    </DataTemplate>
    <DataTemplate x:Key="RentTemplate">
    </DataTemplate>
    <DataTemplate x:Key="BuyTemplate">
    </DataTemplate>
    <Style x:Key="ListViewItemStyle" TargetType="{x:Type ListBoxItem}">
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Property="IsSelected" Value="false"/>
                    <Condition Binding="{Binding SelectedType}" Value="Overview" />
                </MultiDataTrigger.Conditions>
                <Setter Property="ContentTemplate" Value="{StaticResource DefaultItemTemplate}" />
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Property="IsSelected" Value="true"/>
                    <Condition Binding="{Binding SelectedType}" Value="Overview" />
                </MultiDataTrigger.Conditions>
                <Setter Property="ContentTemplate" Value="{StaticResource SelectedItemTemplate}" />
            </MultiDataTrigger>
            <DataTrigger Binding="{Binding SelectedType}" Value="Rent">
                <Setter Property="ContentTemplate" Value="{StaticResource RentTemplate}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding SelectedType}" Value="Buy">
                <Setter Property="ContentTemplate" Value="{StaticResource BuyTemplate}" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

2 个答案:

答案 0 :(得分:2)

您可以使用DataTemplateSelector 可以在这里找到一个教程: http://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector

教程中的一些代码:

public class ImgStringTemplateSelector : DataTemplateSelector
{
    public DataTemplate ImageTemplate { get; set; }
    public DataTemplate StringTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, 
        DependencyObject container)
    {
        String path = (string)item;
        String ext = System.IO.Path.GetExtension(path);
        if (System.IO.File.Exists(path) && ext == ".jpg")
            return ImageTemplate;
        return StringTemplate;
    }
}

XAML:

<Window.Resources>
    <local:RelativeToAbsolutePathConverter x:Key="relToAbsPathConverter" />

    <DataTemplate x:Key="stringTemplate">
      <TextBlock Text="{Binding}"/>
    </DataTemplate>

    <DataTemplate x:Key="imageTemplate">
      <Image Source="{Binding Converter={StaticResource relToAbsPathConverter}}" 
             Stretch="UniformToFill" Width="200"/>
    </DataTemplate>

    <local:ImgStringTemplateSelector 
        ImageTemplate="{StaticResource imageTemplate}" 
        StringTemplate="{StaticResource stringTemplate}" 
        x:Key="imgStringTemplateSelector" />
</Window.Resources>

<ListView ScrollViewer.CanContentScroll="False" 
          ItemsSource="{Binding ElementName=This, Path=PathCollection}" 
          ItemTemplateSelector="{StaticResource imgStringTemplateSelector}">
</ListView>

模板和选择器可以在资源中指定,然后控件必须引用DataTemplateSelector。

答案 1 :(得分:0)

我最终解决了这个问题:

    <Style x:Key="OverviewListViewItemStyle" TargetType="{x:Type ListBoxItem}">
        <Setter Property="ContentTemplate" Value="{StaticResource DefaultItemTemplate}" />
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="true">
                <Setter Property="ContentTemplate" Value="{StaticResource SelectedItemTemplate}" />
            </Trigger>
        </Style.Triggers>
    </Style>
    <Style x:Key="BuyListViewItemStyle" TargetType="{x:Type ListBoxItem}">
        <Setter Property="ContentTemplate" Value="{StaticResource BuyTemplate}" />
    </Style>
    <Style x:Key="RentListViewItemStyle" TargetType="{x:Type ListBoxItem}">
        <Setter Property="ContentTemplate" Value="{StaticResource RentTemplate}" />
    </Style>

在我看来这样做:

    private void RentButton_Click(object sender, RoutedEventArgs e)
    {
        ItemsList.ItemContainerStyle = (System.Windows.Style)Resources["RentListViewItemStyle"];
        _MainWindowViewModel.RentButton_Click();
    }

    private void BuyButton_Click(object sender, RoutedEventArgs e)
    {
        ItemsList.ItemContainerStyle = (System.Windows.Style)Resources["BuyListViewItemStyle"];
        _MainWindowViewModel.BuyButton_Click();
    }

    private void PropertyButton_Click(object sender, RoutedEventArgs e)
    {
        ItemsList.ItemContainerStyle = (System.Windows.Style)Resources["OverviewListViewItemStyle"];
        _MainWindowViewModel.PropertyButton_Click();
    }

这是切换样式的最简单方法,而不会因为弄清楚巫毒与触发器的正确​​组合而浪费太多时间。