编辑:请参阅下面我找到的解决方案。
我正在尝试在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,其中组合框值最终为空。我还没有足够的记录来确切了解发生了什么。
答案 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}"/>
我希望这会有所帮助:)