2013-12-09 7 views
4

Window의 오른쪽에 ContentControl을 설정하고 Content binding Items를 설정합니다 (유형은 ObservableCollection입니다). 이제 그것을 달성하고 싶습니다 : 항목이 없으면 ContentControl은 첫 번째 DataTemplate을 선택하고 항목을 항목에 추가하고 ContentControl은 두 번째 DataTemplate을 선택하여 일부 정보를 표시합니다. 이처럼ContentControl.ContentTemplateSelector 동적으로 템플릿을 선택하십시오.

는 :

enter image description here

문제는 내가 항목에 하나 개의 항목을 추가 할 때, ContentControl을 갱신을 didnot 및 DataTemplate을 변경, 난 등 모드, UpdateSourceTrigger을 설정하는 시도가 있지만 실패했습니다. 뷰 모델에서 후 항목을 삭제, 내가이 문을 사용하여, 그것은 잘 < 1> 작동합니다

private void ExecuteDeleteClientCommand() 
{ 
    ... 
    if (DeleteClient(item)) 
    { 
     ObservableCollection<MyViewModel> tmp = TabItems; 
     TabItems = null; 
     TabItems = tmp; 
    } 
} 

합니다.

<ContentControl 
    ContentTemplateSelector="{StaticResource MyDataTemplateSelector}" 
    Content="{Binding Items}"/> 

.

public class SingleClientDataTemplateSelector : DataTemplateSelector 
{ 
    public override DataTemplate SelectTemplate(object item, 
     DependencyObject container) 
    { 
     ObservableCollection<MyViewModel> obj = 
      item as ObservableCollection<MyViewModel>; 
     if (null == obj || 0 == obj.Count) 
     { 
      return App.Current.FindResource("NullItemDataTemplate") as DataTemplate; 
     } 
     return App.Current.FindResource("DefaultDataTemplate") as DataTemplate; 
    } 
} 

편집 : 사용이 방법은 이후에 하나 개의 항목 삭제 실패 :

RaisePropertyChanging(ItemsPropertyName); 
RaisePropertyChanged(ItemsPropertyName); 

을하지만 < 1> 잘 작동하는 이유 궁금하다.

Edited2 IT는 delcaration입니다 :

public const string ItemsPropertyName = "Items"; 
private ObservableCollection<MyViewModel> items = new ObservableCollection<MyViewModel>(); 
public ObservableCollection<SingleClientDetailViewModel> TabItems 
{ 
    get { return items; } 
    set 
    { 
     if (items == value) { return;} 
     RaisePropertyChanging(ItemsPropertyName); 
    items = value; 
    RaisePropertyChanged(ItemsPropertyName); 
    } 
} 
+0

당신은 당신의보기 모델과'Items' 속성에 대한 'INotifyPropertyChanged' 인터페이스를 구현 적이 있습니까? – Sheridan

+1

mvvmlight를 사용합니다. MyViewModel 클래스는 ViewModelBase에서 상속받습니다. ViewModelBase : ObservableObject : INotifyPropertyChanged입니다. – SubmarineX

답변

7

ContentControlCollectionChanged 이벤트에 대해서만 PropertyChanged 이벤트와하지를 수신합니다. 이 경우에는 ItemsControl 또는 ListView과 같은 다른 버전을 사용해야합니다.

해결 방법으로, 당신은 ContentControl에 대한 Style을 만들 수 있습니다 대신 TemplateSelector의, Items.CountDataTrigger을 정의하고 그에 따라 ContentTemplate을 설정합니다. 뭔가 등이

 <ContentControl Content="{Binding Items}"> 
     <ContentControl.Style> 
      <Style TargetType="ContentControl"> 
       <Setter Property="ContentTemplate" Value="{StaticResource DefaultDataTemplate}" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=Items}" Value="{x:Null}"> 
         <Setter Property="ContentTemplate" Value="{StaticResource NullItemDataTemplate}" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Path=Items.Count}" Value="0"> 
         <Setter Property="ContentTemplate" Value="{StaticResource NullItemDataTemplate}" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
+0

감사합니다. 이렇게하면 잘 작동합니다. 그러나 나는 아직도 수동으로'RaisePropertyChanged (ItemsPropertyName)'를 호출 할 때 작동하지 않는 이유를 모른다. 이제 Items.Count는 1이고, 단 하나의 항목 만 삭제하고 RaisePropertyChanged (ItemsPropertyName)를 호출한다. – SubmarineX

+0

'ItemsPropertyName'의 값이'string' 값'Items'이고 null이 아닌지 확인하십시오. 해당 속성에 대한 속성 선언을 제공하지 않았으므로 추가로 언급 할 수 없습니다. –

+0

편집 됨 2를 참조하십시오. – SubmarineX