WPF ComboBox SelectedItem无法使用ItemsSource

时间:2016-01-20 00:27:41

标签: c# wpf xaml combobox

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

我正在尝试在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,绑定按预期工作。 &#34; Consolas&#34;的默认值因为有FontFamily(字符串源代码)构造函数,所以仍然有效。

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

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

当CustomFontFace是一个字符串时会发生一些事情,并且XAML绑定和代码隐藏尝试设置SelectedValue,其中组合框值最终为空。我还没有足够的记录来确切了解发生了什么。

1 个答案:

答案 0 :(得分: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}"/>

我希望这会有所帮助:)