Как я могу удалить привязку, применяемую к объекту, чтобы применить другую привязку к ней из другого места?Устранение/изменение привязки в WPF
Предположим, у меня есть два шаблона данных, привязанных к тем же объектным ссылкам.
Шаблон данных №1 является шаблоном по умолчанию для загрузки. Я стараюсь, чтобы связать команду кнопки к Function1
из моего класса DataContext:
<Button Content="Button 1" CommandParameter="{Binding }" Command="{Binding DataContext.Function1, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
Это на самом деле работает и функция получает переплетены. Однако, когда я пытаюсь загрузить шаблон данных № 2 к тому же объекту (при попытке связать другую команду кнопки на другую функцию (Function2
) из моего класса DataContext):
<Button Content="Button 2" CommandParameter="{Binding }" Command="{Binding DataContext.Function2, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
Это не работает а первая привязка по-прежнему выполняется. Есть ли обходной путь?
EDIT (для лучшего контекста проблемы):
Я определил мои шаблоны в моих Window.Resources:
<Window.Resources>
<DataTemplate DataType="{x:Type local:ViewModel1}">
<local:View1 />
</DataTemplate>
<DataTemplate DataType="{x:Type local:ViewModel2}">
<local:View2 />
</DataTemplate>
</Window.Resources>
View1.xaml и View2.xaml содержит определение кнопок, которые я описанных выше (я хочу, чтобы они управляли моим потоком процессов). ViewModel1 и ViewModel2 - это мои ViewModels, которые реализуют интерфейс IPageViewModel
, который является типом моей переменной CurrentPageViewModel
.
В моем XAML, я переплетены ContentControl
переменной CurrentPageViewModel
:
<ContentControl Content="{Binding CurrentPageViewModel}" HorizontalAlignment="Center"/>
В моем .cs я список определяется как List<IPageViewModel> PageViewModels
, который я использую, чтобы содержать экземпляры двух моих Просмотр моделей:
PageViewModels.Add(new ViewModel1());
PageViewModels.Add(new ViewModel2());
// Set starting page
CurrentPageViewModel = PageViewModels[0];
Когда я пытаюсь изменить свою модель CurrentPageViewModel
на другую модель представления, это когда я хочу, чтобы новое связывание работало. К сожалению, нет. Правильно ли я делаю?
Являются ли эти кнопки частью DataTemplate? Как вы устанавливаете DataTemplate? По имени? Неявные? Есть ли условие, которое применяется, когда использовать эту функцию? Разве вы не можете использовать 2 разных шаблона? – dowhilefor
Как вы переключаетесь между DataTempates? В зависимости от этого вы можете вызвать [CommandManager.InvalidateRequerySposed] (http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.invalidaterequeriessposed.aspx), чтобы обновить привязки сразу после. – keyboardP
@keyboardP InvalidateRequerySposed не обновляет привязки, а только сообщает системе команд «Еще раз проверьте, могут ли команды выполняться». Он просто переоценивает CanExecute команд. – dowhilefor