gpt4 book ai didi

c# - MVVM ListBox - 根据其索引更改项目的背景

转载 作者:行者123 更新时间:2023-11-30 17:04:54 26 4
gpt4 key购买 nike

我有一个 ListBox,它代表脚本语言中的文本行。我需要“单步执行”脚本,突出显示当前脚本行(比如绿色背景)。

模型 View 有一个“CurrentLine”属性,它是当前行的索引,所以我想我会在 ItemContainerStyle 上写一个触发器并使用转换器来确定列表框项的索引是否与当前行。但是我正在努力将当前行值传递给转换器,因为它来自 VM,而且我无法将非常量值作为参数传递给转换器。我也不能用触发器的“值”这样做。如何传递这些值?

最佳答案

当前线显示为引用类型

修改 ViewModel 以将当前行保存为实际的 LineViewModel(或其他任何内容,具体取决于您的 VM 公开行的方式),而不是选择的索引在我看来是更简洁的解决方案。

然后您可以使用带有检查相等性的转换器的多重绑定(bind)来定义触发器:

<ListBox ItemsSource="{Binding Lines}" x:Name="List">
<ListBox.Resources>
<sample:EqualityConverter x:Key="Converter" />
</ListBox.Resources>
<ListBox.ItemContainerStyle>
<Style TargetType="Control">
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource Converter}">
<Binding Path="DataContext.CurrentLine" ElementName="List" />
<Binding />
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Background" Value="Blue"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>

和转换器:

public class EqualityConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values[0] == values[1];
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

就是这样。

当前行显示为字符串(值类型)

如果您仍想使用整数索引,可以使用AlternationIndex。您将列表的 AlternationCount 设置为它的项目数,这确保每个项目都有其唯一索引,然后绑定(bind)到 ListBoxItem 的附加属性 ItemsSource.AlternationIndex .这样,您就不会混淆具有相同内容的行。

<ListBox ItemsSource="{Binding Resources}" x:Name="List" AlternationCount="{Binding Resources.Count}">
<ListBox.Resources>
<sample:EqualityConverter x:Key="Converter" />
</ListBox.Resources>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource Converter}">
<Binding Path="DataContext.CurrentItem" ElementName="List"/>
<Binding RelativeSource="{RelativeSource Self}" Path="(ItemsControl.AlternationIndex)"/>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Background" Value="Blue"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>

您需要稍微修改转换器:

public class EqualityConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return Equals(values[1], values[0] );
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

关于c# - MVVM ListBox - 根据其索引更改项目的背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16936962/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com