Вам лучше привязываться к объекту, чем к примитивному типу. Этот объект часто называют «моделью» для вашего вида.
WPF использует интерфейс INotifyPropertyChanged для модели (или часто рассматриваемой модели), чтобы уведомить представление о том, что модель изменила состояния.
Итак, сначала вы должны определить класс данных как модель, которая реализует интерфейс INotifyPropertyChanged и запускает событие PropertyChanged всякий раз, когда свойство изменяется.
Когда вы устанавливаете привязку, у вас есть 5 основных элементов привязки, о которых нужно беспокоиться. Связывание имеет исходный объект, исходный путь к исходному объекту, целевой объект, целевое свойство целевого объекта и дополнительный конвертер.
Если вы не указали источник, по умолчанию используется DataContext элемента управления, на которое установлено привязку. Существуют и другие варианты настройки источника. Here - статья Microsoft об установке источника. Затем вы можете установить путь для свойства, чтобы вытащить из источника для привязки. В вашем случае источник является логическим, и нет пути, потому что привязка использует весь исходный объект.
Цель - это всегда элемент управления, на который вы устанавливаете привязку, а свойство target является свойством этого элемента управления, к которому вы привязываетесь. В этом случае MenuItem и IsEnabled.
Конвертер может произвольно преобразовать исходное значение в значение, совместимое с целевым свойством. Вы можете использовать любой объект для конвертера, который реализует IValueConverter или IMultiValueConverter (для MutliBindings).
В вашем случае я бы сначала создал модель, которая реализует INotifyPropertyChanged. Затем я бы присвоил DataContext меню экземпляру модели. Тогда я установил бы связывание:
IsEnabled="{Binding Path=EnableFlag}"
(Где EnableFlag является булево свойство в модели, которую вы хотите, чтобы меню для связывания)
Если вы настроили интерфейс INotifyPropertyChanged правильно, пункт меню будет включен/отключен, когда вы измените это свойство на модели.
"? Как пользовательский интерфейс знать, когда переменная dataChanged фактически изменились" Хороший вопрос. Прямо сейчас я все еще на стадии Data_Binding-Is-Voodoo :) –
Если вы хотите по-настоящему понять, что происходит (материал вуду), вы можете включить .NET-инфраструктуру в визуальную студию и посмотреть на код, который на самом деле выполнено :) –