【问题标题】:Comparing Data Bound ListViewItems in XAML - WPF & C#比较 XAML 中的数据绑定 ListViewItems - WPF 和 C#
【发布时间】:2015-10-08 16:11:54
【问题描述】:

我在 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.Conditions 中的另一个条件,它将当前 ListViewItem 的组与 ListView.SelectedItem 的组进行比较。遗憾的是 WPF 中的 ListViews 没有 ListView.Groups 属性,但如果需要,我可以公开 CollectionView。我该怎么办?

【问题讨论】:

  • 唯一的方法是拥有一个 MultiValueConverter,然后将您的集合视图和当前项目传递给它,然后在那里进行比较。
  • @Versatile 感谢您的快速回复。你能给我举个例子吗?

标签: c# wpf xaml data-binding


【解决方案1】:

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

正如 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属性的值,并在此基础上执行一些代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多