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:

ContentControl.ContentTemplateSelector dynamisch Vorlage auswählen

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.
InformationsquelleAutor SubmarineX | 2013-12-09
Schreibe einen Kommentar