WPF 组合框选定项不适用于项源

本文关键字:不适用 适用于 组合 WPF | 更新日期: 2023-09-27 18:31:07

>编辑:请参阅下面的解决方案,了解我找到的解决方案。

我正在尝试在 WPF/C# 中创建一个组合框,该组合框从 Fonts.SystemFontFamily 中提取所有可用字体,然后根据设置选择该项。

我遇到的问题是 ItemsSource 有效,但如果 Mode=TwoWay,将 SelectedItem 绑定到设置就是清除设置,或者如果 Mode=OneWay 则不选择项目。

这是我的 XAML:

<ComboBox Name="customFontFace" SelectionChanged="customFontFace_SelectionChanged" ItemsSource="{Binding Source={x:Static Fonts.SystemFontFamilies}}" SelectedItem="{Binding Default.CustomFontFace, Source={StaticResource Settings}, Mode=TwoWay}" />

还有后面的一些代码:

public Settings()
{
    InitializeComponent();
    customFontFace.SelectedItem = MyApplication.Properties.Settings.Default.CustomFontFace;
}
private void customFontFace_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // Doing nothing as of yet
}

在Settings.settings中,CustomFontFace 的默认值设置为 Consolas。如果我添加一些日志记录输出,我会看到该设置显示 Consolas,但随后要么被组合框空白,要么不更新组合框,具体取决于设置绑定模式。

我已经尝试了所有模式并尝试在几个地方设置选定项,但我是空的。有什么想法吗?

编辑:找到了我的答案。通过将 CustomFontFace 的类型从字符串更改为 System.Windows.Media.FontFamily,绑定将按预期工作。"Consolas"的默认值仍然有效,因为有一个FontFamily(字符串源)构造函数。

我仍然无法让它在代码隐藏中完美运行,但这是一个更简单的解决方案。作为参考,如果我在代码隐藏中使用它,它可以工作,但前提是 XAML 具有 SelectedItem 的绑定:

customFontFace.SelectedValue = Fonts.SystemFontFamilies.FirstOrDefault(x => x == MyApplication.Properties.Settings.Default.CustomFontFace);

当 CustomFontFace 是一个字符串时,会发生某些情况,并且 XAML 绑定和代码隐藏都尝试设置 SelectedValue,其中组合框值最终为空。我无法记录足够的日志来确切地看到发生了什么。

WPF 组合框选定项不适用于项源

以什么形式存储默认值?如果将其存储为字符串,则可能需要执行以下操作:

customFontFace.SelectedItem = Fonts.SystemFontFamilies.FirstOrDefault(MyApplication.Properties.Settings.Default.CustomFontFace);

因为 WPF 使用 .等于方法来确定选择了哪个项目,如果传入字符串,它可能不起作用。

如果你想使用 xaml 来做到这一点,你可以执行以下操作:

 <ComboBox 
            ItemsSource="{Binding Source={x:Static Fonts.SystemFontFamilies}}"
            DisplayMemberPath="Source" 
            SelectedValuePath="Source" 
            SelectedValue="{Binding Source={x:Static myapplication:Settings.Default}, Path=CustomFontFace}"/>

我希望这对:)有所帮助