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。我该怎么做呢?
我解决了我的问题,但从未更新问题,所以我想我现在就做。
正如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属性的值,并在此基础上执行一些代码。