ContentControl.ContentTemplateSelector dynamisch Vorlage auswählen
Habe ich ein ContentControl im rechten Fenster, und das festlegen von Inhalten verbindliche Elemente (es ist Typ ObservableCollection). Jetzt möchte ich erreichen: wenn es kein Element, ContentControl wählen Sie zuerst DataTemplate, und fügen Sie ein Element in Elemente, ContentControl wird, wählen Sie die zweite DataTemplate an einige Infos.
Wie diese:
Das problem ist wenn ich ein item in items, ContentControl didnot zu aktualisieren und zu ändern DataTemplate, ich habe einen Versuch, um set-Modus, UpdateSourceTrigger, etc., aber fehlgeschlagen. Im ViewModel, nach dem löschen eine Sache, ich benutze diese Aussagen, wird es gut funktionieren <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;
}
}
Bearbeitet:
auf diesem Weg ist auch nicht nach dem löschen eines item:
RaisePropertyChanging(ItemsPropertyName);
RaisePropertyChanged(ItemsPropertyName);
aber ich Frage mich, warum es funktioniert gut mit <1>.
Edited2
Es ist die 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);
}
}
- Haben Sie implementiert die 'INotifyPropertyChanged` - Benutzeroberfläche in der Ansicht Modell und für die
Items
Eigenschaft? - Ich benutze mvvmlight. Die Klasse MyViewModel erbt von ViewModelBase. ViewModelBase : ObservableObject : INotifyPropertyChanged.
Du musst angemeldet sein, um einen Kommentar abzugeben.
ContentControl
hören nur fürPropertyChanged
Veranstaltungen und nicht fürCollectionChanged
Veranstaltung. Sie müssen verwenden Sie entweder eineItemsControl
oder einem seiner anderen Versionen wieListView
für dieses Verhalten.Als Abhilfe können Sie schaffen eine
Style
für dieContentControl
und stattTemplateSelector
definierenDataTrigger
aufItems.Count
und legen Sie dieContentTemplate
entsprechend.So etwas wie,
RaisePropertyChanged(ItemsPropertyName)
in diesem Fall: die Elemente.Count 1 ist, und ich löschen das einzige Element, und rufen Sie RaisePropertyChanged(ItemsPropertyName).ItemsPropertyName
ist diestring
WertItems
und nicht null. Sie hat nicht die Eigenschaft Erklärung für diese Eigenschaft, so kann nicht kommentieren, die weitere.