使用字典方法对WPF中的组合框进行数据绑定的问题

时间:2010-04-12 11:13:29

标签: wpf data-binding binding

我有一个绑定到组合框的词典。我使用字典在枚举中提供空格。

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}" />

这很好用。

我的疑问:

1。我无法将初始值设置为组合框。 在上面的XAML片段中的行

SelectedItem="{Binding Path = SelectedOption}"

无效。我在我的viewmodel中声明了SelectOption。这是字符串类型,我在我的视图模型中初始化了这个字符串值,如下所示:

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

2。组合框绑定到datadictionary,首先有两个选项是“Enter_value”,第二个是“Select_value”,实际上是Option枚举。

根据Option枚举值,我想执行不同的操作。

例如

如果option等于option.Enter_value则

组合框变得可编辑,用户可以在其中输入数值。

如果option等于option.Select_value value则

值来自数据库,组合框变为只读,并显示数据库中的获取值。

请帮助!!

2 个答案:

答案 0 :(得分:3)

如果SelectedOption的类型为Option,则尝试绑定SelectedValue,而不是SelectedItem。

关于您的第二个问题:根据选择,您可以隐藏您的ComboBox并在其中显示TextBlock或TextBox。或者您可以使用RadioButtons并相应地启用或禁用输入。

答案 1 :(得分: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));
        }
    }
}

现在,ComboBoxTextBox的XAML如下所示:

<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>