2013-03-25 2 views
0

단일 ContentControl을 보유하는 MainView가 있고, 응용 프로그램이로드 될 때 ContentControl이 기본 usercontrol을로드합니다.로드 된 사용자 정의 컨트롤 내에서 컨텐트 속성이 호출로 변경된 경우 Contentcontrol을 업데이트 할 수 없습니다.

<ContentControl x:Name="MainContentArea" Content="{Binding ActiveControl}"/> 

로드 해당 UserControl은 몇 가지 플러그인 (무관)을로드하고 콤보 상자에서 항목을 선택시, 그것은 ViewModelLocator의 MVVM Light's 개념을 사용하여 부모 (MainViewModel)에 존재하는 ICommand의를 트리거합니다.

private void CreateSelectedPlugin(IExtendedUIViewFactory plugin) 
    { 
     var pluginStartControl = plugin.Create(); 
     _locator.Main.DefaultCommand.Execute(pluginStartControl); 
    } 

문제는 ContentControl을 갱신하지 않은 것, 나 중단 점을 설정하고, 명령이 MainViewModel에 난 보내 변수가 유효하다는 것을 실행 것을 알 수있다. 다만 예상대로 MAINVIEW가/MainViewModel이 작동에서, null로 ContentControl을을 설정 LoadSection 또는 testfunction를 호출

public ICommand DefaultCommand { get; set; } 
    public MainWindowViewModel() 
    { 
     DefaultCommand = new RelayCommand<object>(LoadSection, o => true); 
    } 

    private void LoadSection(object plugin) 
    { 
     ActiveControl = plugin; 
     //does not matter if i set it to null here 
    } 

.

콘트롤 내에서 보낸 명령은 Contentcontrol에서 다른 내용을로드하지 않게 할 수 있습니까?

답변

0

변경 사항이 있음을 UI에 알릴 필요가 있습니다. Implemement에서 INotifyPropertyChanged 및하여 ActiveControl 할당에 추가 :

private void LoadSection(object plugin) 
{ 
    ActiveControl = plugin; 
    NotifyPropertyChanged(); 
} 

Here is the documentation

편집 # 1

을 나는 당신이 명령에 바인딩 사용자 정의 컨트롤에있는 버튼을 사용한다고 생각하여 메인 윈도우. 이것은 mainwindow 뷰 모델을 usercontrol에 전달하는 것보다 낫습니다. 종속성을 만들고 MVVM 패턴을 위반합니다. 샘플에 UserControl1을이 버튼을 추가하면 그것은 내 응용 프로그램에서, 내가/뷰를 모두 추가 된 UserControls를 개최 하나 개의 메인 창을 사용하여 메인 윈도우의 명령에 대한 상대 바인딩을 사용 나에게

 <Button Content="Set MyContent to null using binding to main window command" Height="40" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},Path=DataContext.PublicCommand}"></Button> 

했다. 이렇게하면 내가 알고있는 한 곳에서만 명령 정의를 표시하고 사용하는 것을 제어 할 수 있습니다. `공공의 목적 ActiveControl { GET {:

희망이

+0

안녕하세요, 감사는 응답을, 내가 실제로 그 안에 INotifyProperty을하는 ModelViewBase, 그래서 내 "ActiveControl"는 다음과 같습니다을 구현하는 데 도움이 return activeControl; } 세트 { ActiveControl = value; RaisePropertyChanged ("ActiveControl"); } } ViewModel에서 GUI를 수동으로 업데이트해야하나요, 아니면 충분합니까? – Swift

+0

나는 더 많은 코드를 볼 필요가 있다고 생각한다. 어떻게 액티브 컨트롤 속성이 정의되어 있는가? mainview datacontext가 정의 된 방법을 보여줄 수 있습니까? –

+0

안녕하세요 J 킹, 나는 당신을 위해 작은 예제를 엮어서 내가 어떻게 돌아가는지 볼 수 있습니다 : [link] (https://www.dropbox.com/s/00pwufd2w4l1u3g/WpfApplication2.zip) – Swift