Nicht finden können die Ressource mit dem Namen 'X', warum nicht?

Ich möchte erstellen Sie eine Assistenten-Benutzeroberfläche für Vorräte-management. Die entsprechende Zeile in der xaml-Code ist:

<ContentPresenter Content="{Binding Current}" ContentTemplateSelector="{StaticResource inventorySelector}"/>

"Aktuelle" wird der aktuell aktive Ansicht-Modell, eine von AvailableInventoriesViewModel, GroupsViewModel, NewArticlesViewModel, ResultViewModel. Die DataTemplateSelector habe ich so definiert:

using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
using Centron.WPF.WarehousingExtension.InventoryModule.ViewModels.WizardViewModels;

namespace Centron.WPF.WarehousingExtension.InventoryModule.UI.DataTemplateSelectors
{
    public class InventoryDatatemplateSelector : DataTemplateSelector
    {
        public DataTemplate AvailableDatatype { get; set; }
        public DataTemplate GroupsDatatype { get; set; }
        public DataTemplate NewDatatype { get; set; }
        public DataTemplate ResultDatatype { get; set; }

        public InventoryDatatemplateSelector()
        {
            Debug.WriteLine("");
        }

        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            if (item is AvailableInventoriesViewModel)
                return AvailableDatatype;
            else if (item is GroupsViewModel)
                return GroupsDatatype;
            else if (item is NewArticlesViewModel)
                return NewDatatype;
            else return ResultDatatype;
        }
    }
}

Dann habe ich Instanzen erstellen von DataTemplates und einen Selektor wie:

<base:InventoryViewBase.Resources>
    <DataTemplate DataType="viewModels:AvailableInventoriesViewModel" x:Key="availableInventoriesDatatype">
        <controls:AvailableInventoriesView />
    </DataTemplate>
    <DataTemplate DataType="viewModels:GroupsViewModel" x:Key="groupsDatatype">
        <controls:GroupsView />
    </DataTemplate>
    <DataTemplate DataType="viewModels:NewArticlesViewModel" x:Key="newArticlesDatatype">
        <controls:NewArticlesView />
    </DataTemplate>
    <DataTemplate DataType="viewModels:ResultViewModel" x:Key="resultDatatype">
        <controls:ResultView/>
    </DataTemplate>
    <selector:InventoryDatatemplateSelector
            x:Key="inventorySelector" 
            AvailableDatatype="{StaticResource availableInventoriesDatatype}"
            GroupsDatatype="{StaticResource groupsDatatype}"
            NewDatatype="{StaticResource newArticlesDatatype}"
            ResultDatatype="{StaticResource resultDatatype}"/>
</base:InventoryViewBase.Resources>

Ich einen Haltepunkt im Konstruktor meiner InventoryDatatemplateSelector, und können Schritt für Schritt durch, aber in der nächste Debug-Schritt, offenbar, wenn versucht wird die erste Eigenschaft dieser Selektor Instanz, bekomme ich sofort eine Ausnahme mit der inneren Ausnahme:

Nicht finden können die Ressource mit dem Namen \"availableInventoriesDatatype\". Ressource-Namen sind case-Sensitiv.

Was ist der deal, warum wird die Ressource nicht gefunden, wenn es klar definiert?

Es gibt ein paar Dinge, die Sie nicht wissen können, verursacht dieses Problem. Zunächst ist xaml (mit sehr wenigen Ausnahmen) analysiert, von oben nach unten und umgewandelt in ein Objekt-graph. Das bedeutet, dass die Reihenfolge ist wichtig. Zweite, DataTemplates sind so konzipiert, dass Sie vergeben sich selbst einen Schlüssel basierend auf Ihren DataType, die (im wesentlichen) verdrängt das x:Key-Eigenschaft. Also, wenn Sie wollen, definieren Sie ein DataTemplate mit einem Datentyp (was vollkommen unnötig ist, wie Sie es verwenden) und ein x:Key, Sie müssen das x:Key-ersten. Verwirrend, ja, aber es ist so, als ein Ergebnis der Herstellung DTs einfacher zu bedienen.

InformationsquelleAutor Hackworth | 2013-03-21

Schreibe einen Kommentar