我在Window的右邊設置了一個ContentControl,並設置了Content binding Items(它的類型是ObservableCollection)。現在我想實現它:如果沒有項目,ContentControl會選擇第一個DataTemplate,並將項目添加到項目中,ContentControl將選擇第二個DataTemplate來顯示一些信息。ContentControl.ContentTemplateSelector動態選擇模板
像這樣:
問題是,當我加入一個項目到項目,ContentControl中因此未更新和更改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 這是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