Window의 오른쪽에 ContentControl을 설정하고 Content binding Items를 설정합니다 (유형은 ObservableCollection입니다). 이제 그것을 달성하고 싶습니다 : 항목이 없으면 ContentControl은 첫 번째 DataTemplate을 선택하고 항목을 항목에 추가하고 ContentControl은 두 번째 DataTemplate을 선택하여 일부 정보를 표시합니다. 이처럼ContentControl.ContentTemplateSelector 동적으로 템플릿을 선택하십시오.
는 :
문제는 내가 항목에 하나 개의 항목을 추가 할 때, 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);
}
}
당신은 당신의보기 모델과'Items' 속성에 대한 'INotifyPropertyChanged' 인터페이스를 구현 적이 있습니까? – Sheridan
mvvmlight를 사용합니다. MyViewModel 클래스는 ViewModelBase에서 상속받습니다. ViewModelBase : ObservableObject : INotifyPropertyChanged입니다. – SubmarineX