2013-07-01 4 views
2

Как я могу удалить привязку, применяемую к объекту, чтобы применить другую привязку к ней из другого места?Устранение/изменение привязки в 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 на другую модель представления, это когда я хочу, чтобы новое связывание работало. К сожалению, нет. Правильно ли я делаю?

+2

Являются ли эти кнопки частью DataTemplate? Как вы устанавливаете DataTemplate? По имени? Неявные? Есть ли условие, которое применяется, когда использовать эту функцию? Разве вы не можете использовать 2 разных шаблона? – dowhilefor

+0

Как вы переключаетесь между DataTempates? В зависимости от этого вы можете вызвать [CommandManager.InvalidateRequerySposed] (http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.invalidaterequeriessposed.aspx), чтобы обновить привязки сразу после. – keyboardP

+0

@keyboardP InvalidateRequerySposed не обновляет привязки, а только сообщает системе команд «Еще раз проверьте, могут ли команды выполняться». Он просто переоценивает CanExecute команд. – dowhilefor

ответ

1

Если по каким-либо причинам вы не можете использовать только два разных DataTemplates, как правило, потому, что эти данные очень большие или сложные, я предлагаю использовать ContentControl и DataTemplateSelector.

В ваших DataTemplates размещайте еще ContentControl, создайте 2 DataTemplates только с вашей кнопкой, один с функцией 1 с Function2. Создайте DataTemplateSelector и установите его на начальном ContentControl. DataTemplateSelector теперь просто нужно выбрать подходящий шаблон в зависимости от решения, например, типа элемента или свойства объекта и т. Д.

1

Если вы все еще хотите удалить привязку, вы можете сделать это из кода: BindingOperations.ClearBinding(txtName, TextBox.TextProperty)

Но подход TemplateSelector будет более эффективным.

+0

Я действительно пробовал это решение, но как я могу преобразовать аргумент объекта в System.Window.DependencyObject? Я попробовал кастинг, но он не работает. – captcalamares