ListView SelectedItem multitrigger for conditions

本文关键字:conditions for multitrigger SelectedItem ListView | 更新日期: 2023-09-27 17:50:49

取决于我的值,我需要得到oldTemplate或newTemplate为选定的项目在listview。代码不工作,我知道,只是想展示我想要实现的

 <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>

是否有任何方法从我的类和绑定模板获得值?

感谢

@edit

我试过这样:创建class

public class BoolTemplate
    {
        public bool BoolTest
        {
            get
            {
                if (Environment.OSVersion.Version.Major < 6)
                    return true;
                else
                    return false;
            }
        }
    }

现在在xaml中为类声明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>

给出错误:

消息:值" Property "必须非零。

InerException:

来源:PresentationFramework

StackTrace: w System.Windows.Condition。密封(ValueLookupType类型)
w System.Windows.ConditionCollection。Seal(valuellookuptype typeSystem.Windows.MultiTrigger.Seal w ()System.Windows.TriggerCollection.Seal w ()System.Windows.Style.Seal ()

ListView SelectedItem multitrigger for conditions

您可以使用Converter实现此结果。

下面是一个例子。我使用了一个叫做OSValue的窗口级属性;你可以使用任何你想要的:

<<p> XAML风格/strong>
<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> 
<<p> 转换器类/strong>
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检索方式的例子