2013-07-01 2 views
2

다른 위치에서 다른 바인딩을 적용 할 수 있도록 객체에 적용된 바인딩을 어떻게 해제 할 수 있습니까?WPF에서 바인딩 해제/변경

동일한 개체 참조에 에 바인드 된 두 개의 데이터 템플릿이 있다고 가정합니다.

데이터 템플릿 # 1이로드되는 기본 템플릿입니다. 나는 나의의 DataContext 클래스에서 Function1에 버튼 명령을 결합하려고 :

<Button Content="Button 1" CommandParameter="{Binding }" Command="{Binding DataContext.Function1, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/> 

이 실제로 작동과 기능은 바인더 제본됩니다.

<Button Content="Button 2" CommandParameter="{Binding }" Command="{Binding DataContext.Function2, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" /> 

그것은 작동하지 않고 : 나는 같은 객체를 데이터 템플릿 # 2를로드 할 때, (다른 내의 DataContext 클래스의 기능 (Function2)에 다른 버튼 명령을 결합하는 동안) 첫 바인딩은 여전히 ​​실행 된 바인딩입니다. 이 문제를 해결할 수 있습니까? (더 나은 문제 상황에 대한)

편집 :

나는 나의 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 버튼의 정의를 포함하는 I (나는 그들이 나의 프로세스 흐름의 통제를 명령하기를 바란다). ViewModel1과 ViewModel2는 내 변수 CurrentPageViewModel의 유형 인 IPageViewModel 인터페이스를 구현하는 ViewModels입니다. 내 XAML에서

, 나는 변수 CurrentPageViewModelContentControl를 바인더 제본 : 내 .CS에서

<ContentControl Content="{Binding CurrentPageViewModel}" HorizontalAlignment="Center"/> 

, 나는 목록 내 두보기 모델의 인스턴스를 포함하는 데 사용 List<IPageViewModel> PageViewModels과 같이 정의했다 :

PageViewModels.Add(new ViewModel1()); 
PageViewModels.Add(new ViewModel2()); 

// Set starting page 
CurrentPageViewModel = PageViewModels[0]; 

CurrentPageViewModel을 다른보기 모델로 변경하려고하면 새 바인딩이 작동하기를 원할 때입니다. 불행히도, 그렇지 않습니다. 내가 일을 제대로하고 있니?

+2

이 단추는 DataTemplate의 일부입니까? 어떻게 DataTemplate을 설정하고 있습니까? 이름으로? 절대적인? 어떤 기능을 사용할 때 적용되는 조건이 있습니까? 두 개의 다른 템플릿을 사용할 수 없습니까? – dowhilefor

+0

DataTempates를 어떻게 전환합니까? 이에 따라 [CommandManager.InvalidateRequerySuggested] (http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.invalidaterequerysuggested.aspx)를 호출하여 바인딩을 바로 업데이트 할 수 있습니다. – keyboardP

+0

@keyboardP InvalidateRequerySuggested는 바인딩을 업데이트하지 않고 명령 시스템에 "명령을 실행할 수 있는지 다시 확인하십시오"라고만 명령합니다. 명령의 CanExecute를 다시 평가합니다. – dowhilefor

답변

1

데이터 패턴이 매우 크거나 복잡하기 때문에 어떤 이유로 두 개의 다른 DataTemplate을 사용할 수없는 경우 ContentControlDataTemplateSelector을 사용하는 것이 좋습니다.

DataTemplates에서 또 다른 ContentControl을 배치하고, 버튼이 포함 된 2 개의 DataTemplate을 만들고, 하나는 Function1과 Function2를 만듭니다. DataTemplateSelector을 만들고 초기 ContentControl에 설정하십시오. DataTemplateSelector은 결정에 따라 적절한 템플리트를 선택하기 만하면됩니다. 예를 들어 항목의 유형이나 항목의 속성 등.

1

바인딩을 설정 해제하려면 다음과 같은 코드에서 수행 할 수 있습니다. BindingOperations.ClearBinding(txtName, TextBox.TextProperty)

그러나 TemplateSelector 방식이 더 효율적입니다.

+0

실제로이 솔루션을 시도했지만 어떻게 내 개체 인수를 System.Window.DependencyObject로 변환 할 수 있습니까? 나는 캐스팅을 시도했지만 작동하지 않습니다. – captcalamares