用于条件的 ListView SelectedItem 多触发器
ListView SelectedItem multitrigger for conditions
根据我的值,我需要为列表视图上的选定项目获取旧模板或新模板。代码不起作用,我知道,只是想展示我想要实现的目标
<Style TargetType="ListViewItem">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="Selector.IsSelectionActive" Value="true" />
<Condition Binding="{Binding Source={x:Static s:Environment.OSVersion.Version.Major}}" Value="5"/>
</MultiTrigger.Conditions>
<Setter Property="Template" Value="{StaticResource SelectedTemplateOld}"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="Selector.IsSelectionActive" Value="true" />
<Condition Binding="Binding Source={x:Static s:Environment.OSVersion.Version.Major}" Value="6"/>
</MultiTrigger.Conditions>
<Setter Property="Template" Value="{StaticResource SelectedTemplateNew}"/>
</MultiTrigger>
</Style.Triggers>
</Style>
有什么方法可以从我的 class 和绑定模板中获取价值吗?
谢谢
@edit
我试过这样:创建class
public class BoolTemplate
{
public bool BoolTest
{
get
{
if (Environment.OSVersion.Version.Major < 6)
return true;
else
return false;
}
}
}
现在在 xaml 中为 class 声明 DataContext 并将资源更改为:
<ListView.DataContext>
<additions:BoolTemplate/>
</ListView.DataContext>
<ListView.Resources>
<Style TargetType="ListViewItem">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="Selector.IsSelectionActive" Value="true" />
<Condition Binding="{Binding BoolTest}" Value="true"/>
</MultiTrigger.Conditions>
<Setter Property="Template" Value="{StaticResource SelectedTemplateOld}"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="Selector.IsSelectionActive" Value="true" />
<Condition Binding="{Binding BoolTest}" Value="true"/>
</MultiTrigger.Conditions>
<Setter Property="Template" Value="{StaticResource SelectedTemplateNew}"/>
</MultiTrigger>
</Style.Triggers>
</Style>
</ListView.Resources>
给我错误:
消息:值“属性”必须为非零。
InerException:
来源:PresentationFramework
StackTrace: w System.Windows.Condition.Seal(ValueLookupType type)
w System.Windows.ConditionCollection.Seal(ValueLookupType type) w
System.Windows.MultiTrigger.Seal() w
System.Windows.TriggerCollection.Seal() w
System.Windows.Style.Seal()
您可以使用 Converter
实现此结果。
这是一个例子。我使用了一个名为 OSValue
的 window 级 属性;你可以使用任何你想要的:
XAML风格
<Style TargetType="{x:Type ListViewItem}" x:Key="myStyle">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="ContentTemplate" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=OSValue, Converter={StaticResource tmplConverter}}"/>
</Trigger>
</Style.Triggers>
</Style>
转换器Class
public class TemplateConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int osValue = System.Convert.ToInt32(value);
var myResourceDictionary = new ResourceDictionary();
myResourceDictionary.Source =
new Uri("/MyApp;component/Dictionary1.xaml",
UriKind.RelativeOrAbsolute);
if(osValue < 6)
return myResourceDictionary["OldTemplate"];
else
return myResourceDictionary["NewTemplate"];
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
当然,这是一个需要改进 DataTemplate
检索方式的示例
根据我的值,我需要为列表视图上的选定项目获取旧模板或新模板。代码不起作用,我知道,只是想展示我想要实现的目标
<Style TargetType="ListViewItem">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="Selector.IsSelectionActive" Value="true" />
<Condition Binding="{Binding Source={x:Static s:Environment.OSVersion.Version.Major}}" Value="5"/>
</MultiTrigger.Conditions>
<Setter Property="Template" Value="{StaticResource SelectedTemplateOld}"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="Selector.IsSelectionActive" Value="true" />
<Condition Binding="Binding Source={x:Static s:Environment.OSVersion.Version.Major}" Value="6"/>
</MultiTrigger.Conditions>
<Setter Property="Template" Value="{StaticResource SelectedTemplateNew}"/>
</MultiTrigger>
</Style.Triggers>
</Style>
有什么方法可以从我的 class 和绑定模板中获取价值吗?
谢谢
@edit
我试过这样:创建class
public class BoolTemplate
{
public bool BoolTest
{
get
{
if (Environment.OSVersion.Version.Major < 6)
return true;
else
return false;
}
}
}
现在在 xaml 中为 class 声明 DataContext 并将资源更改为:
<ListView.DataContext>
<additions:BoolTemplate/>
</ListView.DataContext>
<ListView.Resources>
<Style TargetType="ListViewItem">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="Selector.IsSelectionActive" Value="true" />
<Condition Binding="{Binding BoolTest}" Value="true"/>
</MultiTrigger.Conditions>
<Setter Property="Template" Value="{StaticResource SelectedTemplateOld}"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="Selector.IsSelectionActive" Value="true" />
<Condition Binding="{Binding BoolTest}" Value="true"/>
</MultiTrigger.Conditions>
<Setter Property="Template" Value="{StaticResource SelectedTemplateNew}"/>
</MultiTrigger>
</Style.Triggers>
</Style>
</ListView.Resources>
给我错误:
消息:值“属性”必须为非零。
InerException:
来源:PresentationFramework
StackTrace: w System.Windows.Condition.Seal(ValueLookupType type)
w System.Windows.ConditionCollection.Seal(ValueLookupType type) w System.Windows.MultiTrigger.Seal() w System.Windows.TriggerCollection.Seal() w System.Windows.Style.Seal()
您可以使用 Converter
实现此结果。
这是一个例子。我使用了一个名为 OSValue
的 window 级 属性;你可以使用任何你想要的:
XAML风格
<Style TargetType="{x:Type ListViewItem}" x:Key="myStyle">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="ContentTemplate" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=OSValue, Converter={StaticResource tmplConverter}}"/>
</Trigger>
</Style.Triggers>
</Style>
转换器Class
public class TemplateConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int osValue = System.Convert.ToInt32(value);
var myResourceDictionary = new ResourceDictionary();
myResourceDictionary.Source =
new Uri("/MyApp;component/Dictionary1.xaml",
UriKind.RelativeOrAbsolute);
if(osValue < 6)
return myResourceDictionary["OldTemplate"];
else
return myResourceDictionary["NewTemplate"];
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
当然,这是一个需要改进 DataTemplate
检索方式的示例