[英]Can't bind selection to WPF Combobox
我想要一個帶有兩個選項“ M”和“ F”的ComboBox,並用一個值之一的字符串設置我的代碼中的選擇。 這似乎很基礎,甚至問也很尷尬。 但是,我還沒有看到一個不包含50行代碼以及自定義類等的示例。為了使事情變得更加簡單,我想在XAML中預填充這兩個選項。 為什么這個簡單的任務使我感覺像個精神上的侏儒? 這就是我所擁有的:
<ComboBox x:Name="cboGender" >
<ComboBoxItem Tag="M" Content="M"></ComboBoxItem>
<ComboBoxItem Tag="F" Content="F"></ComboBoxItem>
</ComboBox>
代碼背后:
cboGender.SelectedValue = "M";
在搗毀計算機並永久返回ASP.NET開發之前,請提供幫助。
請嘗試以下操作:
cboGender.ItemsSource = new string [] { "M", "F" };
cboGender.SelectedItem = "M";
您需要將ItemsSource設置為項目集合。 然后,ComboBox將為您生成ComboBoxItems。
添加SelectedValuePath
,它可以工作:
<ComboBox x:Name="cboGender" SelectedValuePath="Content" >
<ComboBoxItem Tag="M" Content="M"></ComboBoxItem>
<ComboBoxItem Tag="F" Content="F"></ComboBoxItem>
</ComboBox>
( SelectedValuePath="Tag"
也會起作用,盡管在兩種情況下在兩個地方使用相同的數據似乎都是多余的 )
作為旁注,類似於Colin的答案,您可以設置以下項:
xmlns:sys="clr-namespace:System;assembly=mscorlib"
<ComboBox x:Name="cboGender">
<sys:String>M</sys:String>
<sys:String>F</sys:String>
</ComboBox>
( 在這種情況下, SelectedItem
和SelectedValue
工作 )
試試這個cboGender.SelectedIndex = 0;
在粉碎系統之前.. :)
大致來說,如果您曾經在代碼中操縱WPF UI元素,那就錯了。 當然,您可以創建一個帶有“ M”和“ F”的組合框並預設其選擇:
<ComboBox>
<ComboBoxItem>M</ComboBoxItem>
<ComboBoxItem>F</ComboBoxItem>
<ComboBox.SelectedIndex>0</ComboBox.SelectedIndex>
</ComboBox>
但是那又怎樣呢? 您如何處理該選擇? 如果您的答案涉及以下內容:
if cboGender.SelectedValue == "M"
您要走的路會導致您編寫很難維護的程序。
另一方面,如果您創建一個類來將UI綁定到該類,如下所示:
public class MyViewModel
{
public MyViewModelClass()
{
Gender = "M";
}
public IEnumerable<string> Genders { get { return new string[] { "M", "F" } };
public string Gender { get; set; }
}
然后,您的MyViewModel
假設您已將DataContext
設置為MyViewModel
的實例, MyViewModel
變為:
<ComboBox ItemsSource="{Binding Genders}" SelectedValue="{Binding Gender}"/>
現在,使用Gender
屬性的任何其他邏輯都將查看此類,而不是UI。 因此,您可以在不影響邏輯的情況下更改UI,反之亦然。
(請注意,盡管視圖模型通常實現INotifyPropertyChanged
,但僅當您要在代碼中更改Gender
並希望新值反映在UI中時,才需要這樣做。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.