我有一个嵌套的列表框(另一个列表框内的列表框)。我想为突出显示/选定的listboxitem以及fontweight设置前景色属性。颜色和字体粗细的值是从xml文件读取的。当执行视图模型构造函数时,SelectedItemForegroundColor和SelectedItemFontWeight属性设置为字符串。除非更新xml文件中的值并重新启动应用程序,否则这些属性仅设置一次,以后将不会随时更改。
这是该问题的XAML代码段。
<Style TargetType="ListBoxItem">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="White"/>
</Style.Resources>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="{Binding SelectedItemForegroundColor, Converter={StaticResource stringToBrushConverter}}"/>
<Setter Property="FontWeight" Value="{Binding SelectedItemFontWeight}"/>
</Trigger>
</Style.Triggers>
</Style>
<ListBox ItemsSource="{Binding ItemsList}" SelectedItem="{Binding SelectedResultItem}" SelectionChanged="OnListBoxSelectionChanged" Background="White" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="0,0,0,5">
<ListBox ItemsSource="{Binding InnerItems}" BorderThickness="0" Background="White"
Foreground="{Binding Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding LabelName}" Margin="0,0,5,0"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
这是用于在视图模型初始化期间设置前景色的属性。
public string SelectedItemForegroundColor
{
get
{
return this.selectedItemForegroundColor;
}
set
{
this.selectedItemForegroundColor = value;
this.RaisePropertyChanged(() => this.SelectedItemForegroundColor);
}
}
public string SelectedItemFontWeight
{
get
{
return this.selectedItemFontWeight;
}
set
{
this.selectedItemFontWeight = value;
this.RaisePropertyChanged(() => this.SelectedItemFontWeight);
}
}
字符串到画笔转换器的类:
每当调用转换器时,对象值为空字符串“”。调试时,我发现属性SelectedItemForegroundColor值不为空。我分配了Green,但它仍保持为Green。
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var brush = DefaultBrush;
if (!string.IsNullOrEmpty(value.ToString()))
{
var color = Color.FromName(value.ToString());
brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(color.A, color.R, color.G, color.B));
}
return brush;
}
属性的值未分配给背景。我还需要知道我们应该使用哪个转换器来更改字体的字体粗细。
提前致谢
最佳答案
我使用Snoop查找绑定问题。发现外部列表框正在获取DataContext,但内部列表框不可访问。我替换了下面的代码
<Setter Property="Foreground" Value="{Binding SelectedItemForegroundColor, Converter={StaticResource stringToBrushConverter}}"/>
与
<Setter Property="Foreground" Value="{Binding Path=DataContext.SelectedResultItemForegroundColor, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}}"/>
现在工作正常。
感谢大家。
关于c# - 样式 setter 中的绑定(bind)值不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25976837/