我在窗口右侧设置了一个ContentControl,并将Content绑定到Items(类型为ObservableCollection)。现在我想实现这样的效果:如果没有项目,ContentControl会选择第一个DataTemplate,并添加一个项目到items,ContentControl将选择第二个DataTemplate来显示一些信息。
就像这样:
图片
问题是当我向items中添加一个项目时,ContentControl没有更新并更改DataTemplate。我尝试设置模式、UpdateSourceTrigger等,但失败了。在ViewModel中,删除一个项目后,我使用这些语句,它能很好地工作<1>:
就像这样:
图片
问题是当我向items中添加一个项目时,ContentControl没有更新并更改DataTemplate。我尝试设置模式、UpdateSourceTrigger等,但失败了。在ViewModel中,删除一个项目后,我使用这些语句,它能很好地工作<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>中表现良好。
编辑2 这是声明:
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);
}
}