2010-04-12 45 views
1

我有一個綁定到組合框的字典。我已經使用字典在枚舉中提供空格。問題DataBinding使用字典方法的枚舉WPF中的組合框

public enum Option {Enter_Value, Select_Value}; 

Dictionary<Option,string> Options; 

    <ComboBox           
     x:Name="optionComboBox" 
     SelectionChanged="optionComboBox_SelectionChanged" 
     SelectedValuePath="Key" 
     DisplayMemberPath="Value" 
     SelectedItem="{Binding Path = SelectedOption}" 
     ItemsSource="{Binding Path = Options}" /> 

這工作正常。

我的查詢:

我不能到初始值設置爲組合框。 在上面的XAML代碼行

SelectedItem="{Binding Path = SelectedOption}" 

不起作用。我在我的viewmodel中聲明瞭SelectOption。這是字符串類型和我在我的視圖模型如下面intialized此字符串值:

SelectedOption = Options[Options.Enter_Value].ToString(); 

2.組合框被綁定到數據字典,其具有兩個選項首先是「Enter_value」和第二個是「Select_value 「這實際上是選項枚舉。

基於Option枚舉值,我想執行不同的操作。

例如

如果選擇是等於option.Enter_value然後

組合框變得可編輯和用戶可以在其中輸入的數值。

如果選項相當於option.Select_value值,那麼

的價值來自於數據庫和組合框變成只讀狀態,並顯示從數據庫中獲取價值。

請幫忙!!

回答

3

嘗試綁定的SelectedValue,而不是將selectedItem如果SelectedOption是類型的選項。

關於你的第二個問題:基於選擇你可以隱藏你的ComboBox並在它的位置顯示一個TextBlock或TextBox。或者您可以使用RadioButtons並相應地啓用或禁用輸入。

+0

感謝您的答覆majocha ..第二個解決方案,實際上我使用列表視圖和組合框顯示在其中一列。我已經定義爲一個GridView。細胞模板。因此我不能使用單選按鈕或顯示/隱藏控件。 – 2010-04-13 02:01:04

1

您的問題可能是您已將SelectedItem綁定到錯誤類型的屬性。

ItemsControl將迭代其ItemsSource的枚舉器以構建其項目列表。您的字典的枚舉器類型爲KeyValuePair<Option, string>。所以你的SelectedOption屬性也必須是這種類型的 - 如果你在應用程序運行時查看輸出窗口,你可能會在那裏看到一個數據綁定錯誤。

我不明白你的第二個問題。

編輯

好吧,這是一個容易得多,只需要提供一個工作示例,而不是解釋爲什麼代碼,我看不出不工作。

首先,你需要實現INotifyPropertyChanged視圖模型類,並暴露SelectedItemValueIsValueReadOnly屬性和正確地提出了這些屬性時,選擇的項目變化PropertyChanged事件。

public enum Option 
{ 
    EditOption, 
    OtherOption 
} ; 

public class MyViewModel : INotifyPropertyChanged 
{ 
    private Dictionary<Option, string> _Items; 
    private KeyValuePair<Option, string> _SelectedItem; 
    private string _Value; 

    public MyViewModel() 
    { 
     _Items = new Dictionary<Option, string> 
     { 
      {Option.EditOption, "Editable value"}, 
      {Option.OtherOption, "Other value"} 
     }; 
    } 

    public Dictionary<Option, string> Items 
    { 
     get { return _Items; } 
    } 

    public KeyValuePair<Option, string> SelectedItem 
    { 
     get { return _SelectedItem; } 
     set 
     { 
      _SelectedItem = value; 
      OnPropertyChanged("SelectedItem"); 
      OnPropertyChanged("IsValueReadOnly"); 
      OnPropertyChanged("Value"); 
     } 
    } 

    public bool IsValueReadOnly 
    { 
     get { return _SelectedItem.Key != Option.EditOption; } 
    } 

    public string Value 
    { 
     get { return IsValueReadOnly ? "Read-only" : _Value; } 
     set { _Value = value; } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler h = PropertyChanged; 
     if (h != null) 
     { 
      h(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

現在XAML爲您ComboBoxTextBox看起來是這樣的:

<Window x:Class="WpfApplication6.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:WpfApplication6="clr-namespace:WpfApplication6" 
     Title="MainWindow"> 
    <Window.DataContext> 
     <WpfApplication6:MyViewModel/> 
    </Window.DataContext> 
    <StackPanel> 
     <ComboBox ItemsSource="{Binding Items}" 
       DisplayMemberPath="Key" 
       SelectedItem="{Binding SelectedItem}"/> 
     <TextBox Text="{Binding Value}" 
       IsReadOnly="{Binding IsValueReadOnly}"/> 
    </StackPanel> 
</Window> 
+0

感謝Robert的回覆。我會嘗試第一個解決方案,也重新構建第二個問題,請參閱是否可以給我解決方案 – 2010-04-12 16:27:22

+0

我嘗試了第一個解決方案,但它不起作用。仍然我得到選定的索引-1 – 2010-04-21 09:26:43