Возможно, ваша проблема в том, что вы связали 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>