【问题标题】:Switch control template of listview when clicking a button单击按钮时切换列表视图的控制模板
【发布时间】:2014-12-08 17:33:47
【问题描述】:

当我单击按钮时,是否可以使用 xaml 设置我的列表视图的控件模板?

现在我知道当我选择了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 来选择更改属性时要使用的模板(单击按钮时会更改)。我不认为这种情况是理想的,但我不知道还有什么办法。

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

我正在尝试制作的场景如下: 如果我推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>

【问题讨论】:

  • 您似乎正在搜索DataTemplateSelector。例如,请参阅本教程:tech.pro/tutorial/807/…
  • @FlatEric:我会将其发布为答案,并附上使用示例。

标签: c# wpf controltemplate


【解决方案1】:

您可以使用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。

【讨论】:

  • 如何使用我的按钮单击来更改选定的模板?我读过in an other answer 说选择模板是一个只会发生一次的事件。
  • 或许这篇文章能解决你的问题:stackoverflow.com/questions/8715315/…
  • 埃里克,我已经尝试应用这些建议并编辑了我的问题。
【解决方案2】:

我最终是这样解决的:

    <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();
    }

这是切换样式的最简单方法,而不会浪费太多时间来找出伏都教和触发器的正确​​组合。

【讨论】:

    猜你喜欢
    • 2014-04-27
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    相关资源
    最近更新 更多