单击按钮时,是否可以使用xaml设置listview的控件模板?
现在我知道如何在我选择ListViewItem
时设置我的内容模板,而不是在列表视图之外的内容发生变化时如何更改我的控件模板。
点击相应按钮后,我想更改ListItemTemplate
以使用RentTemplate
或BuyTemplate
。
<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
我想看BuyTemplate
。
RentButton
与RentTemplate
相同。
但是当我按下第三个按钮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>
答案 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();
}
这是切换样式的最简单方法,而不会因为弄清楚巫毒与触发器的正确组合而浪费太多时间。