首页 文章

WPF ComboBox SelectedItem无法使用ItemsSource

提问于
浏览
0

编辑:请参阅下面我找到的解决方案 .

我试图在WPF / C#中创建一个ComboBox,从Fonts.SystemFontFamilies中提取所有可用字体,然后根据设置选择项目 .

我遇到的问题是ItemsSource工作,但将SelectedItem绑定到设置是清除设置,如果Mode = TwoWay,或者如果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,但随后组合框被消隐或者不更新组合框,具体取决于设置绑定模式 .

我已经尝试了所有的模式,并尝试在几个地方设置SelectedItem,我要空了 . 有什么想法吗?

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

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

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

当CustomFontFace是一个字符串时会发生一些事情,并且XAML绑定和代码隐藏尝试设置SelectedValue,其中组合框值最终为空 . 我无法记录到足以确切知道发生了什么 .

1 回答

  • 0

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

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

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

    如果您想使用xaml来执行此操作,您可以执行以下操作:

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

    我希望这有帮助 :)

相关问题