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?
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, ich habe die Lösung gefunden. Der einzige Fehler war, dass der "Schlüssel" - Eigenschaft einer Ressource muss zuerst eingestellt werden. Also statt:
Brauche ich:
Xaml ist genial, dein Kommentar ist ungültig. Ich bin mir nicht sicher, warum Sie selbst stört die Verwendung von statischen Ressourcen, wenn Sie könnten, die Sie definiert haben, Sie inline in Ihrem data template selector. Auch, wie Sie dies tun, ist ein bisschen merkwürdig. Content-Steuerelemente wird automatisch suchen und durch Mittel für die erste Daten-Vorlage mit einem bestimmten Typ, so dass Sie könnte wahrscheinlich haben von vornherein Ihre Selektor, wenn jede Vorlage ist abgestimmt auf eine bestimmte Art
Ich habe versucht es auf Ihre Weise. Ich nahm den Schlüssel Eigentum von meinem DataTemplates und verwendet keine Auswahl auf dem ContentPresenter. Alles, was jetzt angezeigt wird, in der ContentPresenter Aktuell ist.ToString(), die nicht der tatsächlichen Kontrolle. Es passiert auch wenn ich die DataTemplates in der ContentPresenter.Ressourcen.
Wechsel von einem ContentPresenter (üblicherweise in einem ContentControl Vorlage) zu einem ContentControl.
Dies scheint dumm. Die Reihenfolge der Attribute ist nicht signifikant in XML, XAML auf XML basiert, würde ich nicht erwarten, dass die Reihenfolge der attribute wichtig zu sein.
InformationsquelleAutor Hackworth
Ich wissen Sie Ihr problem gefunden, aber es gibt eine einfachere Möglichkeit, um dieses Problem zu lösen, dass ich dachte, Sie kennen sollten. Da jede Ihrer DataTemplates arbeiten an verschiedenen Klassen, die Sie nicht wirklich brauchen, um zu bauen Ihre DataTemplateSelector, dies zu tun. Wenn Sie einfach erklären, Ihre DataTemplates ohne Tasten wie:
Und erklären Sie Ihre
ContentPresenter
ohne Angabe derContentTemplateSelector
wie:Dann die entsprechenden DataTemplate ausgewählt werden, für welche Art
Current
festgelegt ist.Dies ist eine viel sauberere Lösung und beseitigt die Notwendigkeit für die benutzerdefinierte Auswahl.
WPF ist mächtig und sehr flexibel, kann aber sein, es kann schwierig sein, um Ihren Kopf gewickelt um ihn herum. Aber wenn Sie verstehen, was Sie tun können, ich denke, dass Sie ändern Ihre Meinung über die Angelegenheit.
Hoffe, das hilft.
Mein Punkt ist, dass Sie nicht brauchen, um abzutreten
DataTemplate
zu Ihrem ContentPresenter. Lassen Sie den Schlüssel aus IhrerDataTemplate
Erklärungen, dann ist deinContentPresenter
verwenden dieDataTemplate
passtDataType
automagisch.Ich habe versucht es auf Ihre Weise. Ich nahm den Schlüssel Eigentum von meinem DataTemplates und verwendet keine Auswahl auf dem ContentPresenter. Alles, was jetzt angezeigt wird, in der ContentPresenter Aktuell ist.ToString(), die nicht der tatsächlichen Kontrolle. Es passiert auch wenn ich die DataTemplates in der ContentPresenter.Ressourcen.
Es muss noch etwas anderes Verschrauben Sie dann, weil es für mich funktioniert. Wenn Sie nicht bekommen kann es arbeiten, dann würde ich nach einer anderen Frage, der Frage " was ist falsch mit Ihrem neuen code. Es wird schwierig sein, zu diagnostizieren, alles in die Kommentare und es wird nicht hilfreich sein für zukünftige Benutzer, die mit dem gleichen problem.
Auch Sie korrekt sind, müssen Sie die x:Geben Sie auf die Datentyp-Deklarationen. Hatte ich erst vor kurzem entdeckt, dass ich nicht immer von der x:Type-syntax (anscheinend ist es nicht universell funktionieren). Ich habe meine Beispiel-app, und sicher genug, ich war mit x:Typ und wenn ich es entfernt funktioniert es nicht mehr. Sorry für die Aufsicht. Ich habe die Feste Beispiel für zukünftige Nutzer.
InformationsquelleAutor Brent Stewart
Hier war mein Fall - als ich erklärte, ItemTemplate, bevor DataTemplate:
Dann ändere ich einfach die Reihenfolge, und setzen Sie Grid.Ressourcen, bevor die Listbox wie Balg, alles gut jetzt!!!
Ist nicht XAML so dumm? 🙂 🙂
InformationsquelleAutor Shahdat
Gebe ich mehr detail im Fall von styling-geschachtelte Komponenten. In diesem Beispiel MainWindowGrid enthält UserControlGrid und PanelGrid.
Der folgende code funktioniert nicht.
Nun, wenn Sie die swap-Erklärung Reihenfolge, so dass die MainWindowGrid geht letzten, es wird funktionieren. (Äußerer Rahmen, geht auch die Letzte)
InformationsquelleAutor micksatana