XAML - WPF中数据绑定listviewitem的比较c#

本文关键字:比较 listviewitem 数据绑定 WPF XAML | 更新日期: 2023-09-27 18:16:44

我有一个在XAML中定义的样式,应用于ListView中的所有listviewitem。ItemsSource是与后面代码中的属性绑定的数据(不,在这个应用程序中几乎没有MVVM)。样式具有条件数据触发器。样式看起来像这样:

<Window.Resources>
    <local:IsNullConverter x:Key="isNullConverter"/>
    <Style x:Name="buttonStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="IsEnabled" Value="True"/>
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Converter={StaticResource isNullConverter}, ElementName=lvItems, Path=SelectedItem}" Value="False"/>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="False"/>
                </MultiDataTrigger.Conditions>
                <Setter Property="Effect">
                    <Setter.Value>
                        <BlurEffect Radius="2"></BlurEffect>
                    </Setter.Value>
                </Setter>
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

我有另一个样式,可以在ListView中进行分组,看起来像这样:

<Style x:Key="ListViewItemContainerStyle" TargetType="{x:Type GroupItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Expander IsExpanded="False">
                        <Expander.Header>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Name}" VerticalAlignment="Bottom"/>
                            </StackPanel>
                        </Expander.Header>
                        <ItemsPresenter/>
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

在代码后面,我给ListView一个PropertyGroupDescription,像这样:

CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(Cities);
        PropertyGroupDescription groupDescription = new PropertyGroupDescription("Continent");
        view.GroupDescriptions.Add(groupDescription);

我需要的是MultiDataTrigger中的另一个条件。条件,将当前ListViewItem的组与ListView.SelectedItem的组进行比较。遗憾的是,WPF中的列表视图没有列表视图。Groups属性,但如果需要,我可以公开CollectionView。我该怎么做呢?

XAML - WPF中数据绑定listviewitem的比较c#

我解决了我的问题,但从未更新问题,所以我想我现在就做。

正如Versatile所提到的,您需要一个MultiValueConverter。我使用了它,它看起来像这样:

<Window.Resources>
    <conv:ServiceMultiValueConverter x:Key="serviceMultiValueConverter"/>
    <Style x:Name="buttonCommandStyle" x:Key="buttonCommandStyle" BasedOn="{StaticResource {ComponentResourceKey 
        TypeInTargetAssembly={x:Type res:StabiJobCustomResources}, 
        ResourceId=ListViewItemCommentsStyle}}" TargetType="{x:Type ListViewItem}">            
        <Style.Triggers>
            <DataTrigger Value="False">
                <DataTrigger.Binding>
                    <MultiBinding
                  Converter="{StaticResource serviceMultiValueConverter}">
                        <Binding ElementName="lvServices" Path="SelectedItem"/>
                        <Binding ElementName="viewMain" Path="ViewModelMain"/>
                        <Binding ElementName="btSwitch"/>
                    </MultiBinding>
                </DataTrigger.Binding>
                <Setter Property="Opacity" Value="100"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

使用它的ListView是这样的:

<ListView Name="lvServices" ItemContainerStyle="{StaticResource buttonCommandStyle}" ItemsSource="{Binding Services}"
              Grid.Row="1"
               PreviewMouseLeftButtonUp="lvServices_PreviewMouseLeftButtonUp" SelectionChanged="lvServices_SelectionChanged">
        <ListView.GroupStyle>
            <GroupStyle ContainerStyle="{StaticResource {ComponentResourceKey 
                TypeInTargetAssembly={x:Type res:StabiJobCustomResources}, 
                ResourceId=SJListViewContainerStyle}}"/>
        </ListView.GroupStyle>
        <ListView.View>
            <GridView>
                <GridViewColumn Width="auto" Header="Name" DisplayMemberBinding="{Binding Name}"/>
                <GridViewColumn Header="Description" Width="350" DisplayMemberBinding="{Binding Description}"/>
                <GridViewColumn Header="Status" Width="auto" DisplayMemberBinding="{Binding Status}"/>
            </GridView>
        </ListView.View>            
    </ListView>

MultiValueConverter类看起来像这样:

public class ServiceMultiValueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        // Read values, and set Command binding and content property of Button btSwitch.
        // 0 for selected item
        // 1 for viewmodelmain
        // 2 for button
        if(values.IsNotEmpty() && values.IsExpectedQuantity(3))
        {
            Service selectedService = (Service)values[0];
            ViewModelMain viewModel = (ViewModelMain)values[1];
            Button btSwitch = (Button)values[2];
            if(selectedService.Status == "Running")
            {
                btSwitch.IsEnabled = true;
                btSwitch.Content = "Stop Service";
                btSwitch.Command = viewModel.StopService;
                btSwitch.CommandParameter = selectedService;
            }
            else if(selectedService.Status == "Stopped")
            {
                btSwitch.IsEnabled = true;
                btSwitch.Content = "Start Service";
                btSwitch.Command = viewModel.StartService;
                btSwitch.CommandParameter = selectedService;
            }
        }
        return null;
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        return null;
    }
}

Service对象是一个具有几个属性的模型。如上所示,我现在简单地比较了Model属性的值,并在此基础上执行一些代码。