Проблема в DataBinding Enum с использованием словарного подхода к комбинированному списку в WPF - PullRequest
1 голос
/ 12 апреля 2010

У меня есть словарь, который привязан к комбинированному списку. Я использовал словарь, чтобы обеспечить пробелы в enum.

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

не работает. Я объявил 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 ]

3 голосов
/ 12 апреля 2010

Попробуйте связать SelectedValue, а не SelectedItem, если SelectedOption имеет тип Option.

О вашем втором вопросе: в зависимости от выбора вы можете скрыть ComboBox и отобразить на нем TextBlock или TextBox. Или вы можете использовать RadioButtons и включить или отключить вход соответственно.

1 голос
/ 12 апреля 2010

Возможно, ваша проблема в том, что вы связали SelectedItem со свойством неправильного типа.

ItemsControl перебирает свой перечислитель ItemsSource для построения списка элементов. Перечислитель для вашего словаря имеет тип KeyValuePair<Option, string>. Таким образом, ваше свойство SelectedOption также должно относиться к этому типу - если вы посмотрите в окно «Вывод» во время работы приложения, вы, вероятно, увидите там ошибку привязки данных.

Я не могу понять ваш второй вопрос.

Редактировать

Хорошо, гораздо проще просто привести рабочий пример, чем объяснить, почему код, который я не вижу, не работает.

Во-первых, вам нужен класс модели представления, который реализует INotifyPropertyChanged и предоставляет свойства SelectedItem, Value и IsValueReadOnly и который корректно вызывает события 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 для ваших ComboBox и TextBox выглядит следующим образом:

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