2010-04-12 42 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