我有一个嵌套的列表框(另一个列表框内的列表框)。我想为突出显示/选定的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/

10-11 11:26