Sub*_*neX 7 c# wpf mvvm contenttemplateselector
我在Window的右边设置了一个ContentControl,并设置了内容绑定项(它的类型是ObservableCollection).现在我想实现它:如果没有项目,ContentControl选择第一个DataTemplate,并将项目添加到项目中,ContentControl将选择第二个DataTemplate来显示一些信息.
像这样:
问题是当我在项目中添加一个项目时,ContentControl没有更新和更改DataTemplate,我尝试设置模式,UpdateSourceTrigger等,但失败了.在ViewModel中,删除一个项目后,我使用这个语句,它将很好地工作<1>:
private void ExecuteDeleteClientCommand()
{
...
if (DeleteClient(item))
{
ObservableCollection<MyViewModel> tmp = TabItems;
TabItems = null;
TabItems = tmp;
}
}
Run Code Online (Sandbox Code Playgroud)
.
<ContentControl
ContentTemplateSelector="{StaticResource MyDataTemplateSelector}"
Content="{Binding Items}"/>
Run Code Online (Sandbox Code Playgroud)
.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑: 使用这种方式删除一项后也失败:
RaisePropertyChanging(ItemsPropertyName);
RaisePropertyChanged(ItemsPropertyName);
Run Code Online (Sandbox Code Playgroud)
但我想知道为什么它适用于<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);
}
}
Run Code Online (Sandbox Code Playgroud)
Mat*_*t J 10
ContentControl
只会听PropertyChanged
事件,而不是CollectionChanged
事件.您需要使用其中一个ItemsControl
或任何其他版本,例如ListView
此行为.
作为一种变通方法,您可以创建一个Style
for ContentControl
而不是TemplateSelector
,定义一个DataTrigger
on Items.Count
并相应地设置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>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10155 次 |
最近记录: |