[英]WPF binding to ComboBox SelectedItem when reference not in ItemsSource
[英]WPF ComboBox SelectedItem not working with ItemsSource
編輯:請參閱以下我找到的解決方案。
我試圖在WPF / C#中創建一個組合框,該組合框從Fonts.SystemFontFamilies中提取所有可用的字體,然后根據設置選擇該項目。
我遇到的問題是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,但是根據設置的綁定模式,要么被組合框遮住,要么不更新組合框。
我已經嘗試了所有模式,並嘗試在幾個地方設置SelectedItem,但是我空了。 有什么想法嗎?
編輯:找到了我的答案。 通過將CustomFontFace的類型從字符串更改為System.Windows.Media.FontFamily,綁定將按預期工作。 由於存在FontFamily(字符串源)構造函數,因此“ Consolas”的默認值仍然有效。
我仍然無法在后台代碼中使其完美運行,但這是一個簡單得多的解決方案。 作為參考,如果我在后面的代碼中使用了它,則它可以工作,但前提是XAML具有SelectedItem的綁定:
customFontFace.SelectedValue = Fonts.SystemFontFamilies.FirstOrDefault(x => x == MyApplication.Properties.Settings.Default.CustomFontFace);
當CustomFontFace是一個字符串,並且XAML綁定和代碼隱藏都嘗試設置SelectedValue時,會發生某些情況,其中組合框值最終為空白。 我還沒有足夠的日志記錄來查看正在發生的事情。
您以什么形式存儲默認值? 如果將其存儲為字符串,則可能必須執行以下操作:
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}"/>
我希望這有幫助 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.