다른 위치에서 다른 바인딩을 적용 할 수 있도록 객체에 적용된 바인딩을 어떻게 해제 할 수 있습니까?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에서
, 나는 변수 CurrentPageViewModel
에 ContentControl
를 바인더 제본 : 내 .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
을 다른보기 모델로 변경하려고하면 새 바인딩이 작동하기를 원할 때입니다. 불행히도, 그렇지 않습니다. 내가 일을 제대로하고 있니?
이 단추는 DataTemplate의 일부입니까? 어떻게 DataTemplate을 설정하고 있습니까? 이름으로? 절대적인? 어떤 기능을 사용할 때 적용되는 조건이 있습니까? 두 개의 다른 템플릿을 사용할 수 없습니까? – dowhilefor
DataTempates를 어떻게 전환합니까? 이에 따라 [CommandManager.InvalidateRequerySuggested] (http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.invalidaterequerysuggested.aspx)를 호출하여 바인딩을 바로 업데이트 할 수 있습니다. – keyboardP
@keyboardP InvalidateRequerySuggested는 바인딩을 업데이트하지 않고 명령 시스템에 "명령을 실행할 수 있는지 다시 확인하십시오"라고만 명령합니다. 명령의 CanExecute를 다시 평가합니다. – dowhilefor