16 Stimmen

Ein DataTemplate überblendbar machen

Wie kann ich ein Datatemplate für ein ViewModel blendable (designable in expression blend) machen. Wenn ich zu den Ressourcen gehe und versuche, das DataTemplate direkt zu bearbeiten, ist alles, was ich auf dem Drawingborad sehe, ein leeres Rechteck. Das liegt daran, dass das DataTemplate nicht an etwas gebunden ist. Natürlich kann ich ein UserControl erstellen und dort einige Designtime-Daten im Code erstellen, um die Vorlage zu sehen, aber ich müsste jetzt zwischen der Ressource (zum Bearbeiten) und dem UserControl (um das Ergebnis meiner Bearbeitung zu sehen) hin und her wechseln. Gibt es nicht eine direktere Möglichkeit, mein DataTemplate zu bearbeiten und zu sehen?

0 Stimmen

Lassen Sie mich wissen, ob das für Sie in Ordnung ist oder ob Sie nach etwas anderem suchen.

0 Stimmen

(bezüglich der Bitte, die Kommentare neu zu ordnen - das ist in den Tools nicht möglich; Jeff könnte es wahrscheinlich in der Datenbank machen, aber ich bin mir nicht sicher, ob es das wert ist...)

25voto

Anderson Imes Punkte 25252

Es ist ein bisschen schwierig, es zu benutzen, aber Blend hat eine Funktion namens "Design-Time Data", die dir dabei helfen kann. Am Anfang ist es schwierig, aber wenn man ein paar davon gemacht hat, ist es ziemlich einfach. Es zwingt einen auch in ein schönes Muster für DataContext.

Hier ist ein guter Link zu diesem Thema: http://www.robfe.com/2009/08/design-time-data-in-expression-blend-3/

Hier ein paar ausgewählte Auszüge:

Über Design-Time-Größen

...können die Eigenschaften der Entwurfszeit sicher von anderen Werkzeugen ignoriert werden und sie werden zur Laufzeit ignoriert (mc:Ignorable gibt an, dass der Namespace mit dem Präfix "d" ignoriert werden kann ignoriert werden kann).

 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 mc:Ignorable="d"

Expression Blend verwendet zwei Entwurfszeiten Eigenschaften (d:DesignWidth, d:DesignHeight), um eine Größe für ein Steuerelement, das zur Entwurfszeit verwendet werden soll...

Über Datenquellen zur Entwurfszeit

Ich bin über d:Datacontext gestolpert, als ich mit Blend 3 spielte und versuchte eine "Live-Datenquelle" zu meinem Fenster Fenster hinzuzufügen. Ich dachte, es würde zu genauso verhalten wie die alte Methode einen DataContext zu setzen, aber als ich meine Anwendung startete, gab es keine Daten! ...

Das Ergebnis ist also, dass wir jetzt schreiben können Code wie diesen schreiben:

...
<Grid ...
      DataContext="{StaticResource GameDataSource}"
      d:DataContext="{StaticResource DesignTime_DateDataSource}">

Beachten Sie, dass dies für Blend 3 gilt, wenn Sie die Unterstützung von Erstanbietern für diese Funktionen wünschen. Sie sind ziemlich gut - es gibt sogar einen Designer für die Design-Time-Daten, obwohl ich noch nicht in diese Funktionen geschaut habe.

Anwenden auf DataTemplates

Das ist etwas, das ich mir ausgedacht habe, aber es scheint zu funktionieren. Hier verwende ich die Design-Time-Datenfunktion, um Daten in den d:DataContext des visuellen Elements zu ziehen. Sie müssen Folgendes tun für jedes Element der obersten Ebene, für das ein DataContext gesetzt werden musste .

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <!-- Resource dictionary entries should be defined here. -->
    <DataTemplate x:Key="MyTemplate">
        <TextBlock Text="{Binding Text}" d:DataContext="{StaticResource SampleDataSource}" />
    </DataTemplate>
</ResourceDictionary>

Die Bindungssyntax ist ein wenig expliziter, wenn Sie ein DataTemplate mit einem DataType-Satz verwenden, aber es funktioniert trotzdem:

<DataTemplate DataType="{x:Type vm:MyViewModel}" >
   <TextBlock Text="{Binding Text}" 
              d:DataContext="{Binding Source={StaticResource SampleDataSource}}" />
</DataTemplate>

Mit dieser Strategie können Sie sehen, wie das DataTemplate funktionieren wird während der direkten Bearbeitung Sie werden das Ergebnis jedoch in keiner Ansicht sehen können, die dieses DataTemplate verwendet, es sei denn, Sie führen die Anwendung tatsächlich aus. Dies ist eine Einschränkung von Blend im Moment aufgrund der Tatsache, dass sie nicht zu sein scheinen mit Mocks, sondern komplette Ersatz-Objekte. Wenn Blend jemals die Möglichkeit hinzufügt, eine neue gefälschte Datenquelle zu erstellen, indem Sie auf "New DataSource -> Based on Referenced Object -> MyCustomerObject" klicken, dann werden Sie im Geschäft sein.

Es ist möglich, dass Sie diese Einschränkung mit einem eigenen Trick mit angehängtem Eigentum überwinden können, aber es wäre bestenfalls schwierig.

Alternative

Eine Alternative, die funktioniert in cada Situation, ist aber etwas umständlicher einzurichten, ist die Einrichtung von StaticResources, die während der Laufzeit gefälschte Daten gegen echte Daten austauschen, aber im Designer statische Beispieldaten anzeigen.

Hier ist ein wirklich großartiger Artikel von Karl Shifflett, der einige dieser Techniken und ein paar Videos dazu enthält: http://karlshifflett.wordpress.com/2008/10/11/viewing-design-time-data-in-visual-studio-2008-cider-designer-in-wpf-and-silverlight-projects/

Ich hoffe, das hilft, Anderson

0 Stimmen

Ich bin mir dieser beiden Merkmale bewusst. Ich kann nur keine Möglichkeit finden, sie mit Datenvorlagen zu verwenden. Wie würde ich einem DataTemplate Designtime-Daten zuweisen? Ein Datatemplate selbst verfügt nicht über eine DataContext-Eigenschaft. Ich könnte ein Fenster erstellen, das auf diese Datenvorlagen verweist, und den Datenkontext auf das Fenster setzen. So kann ich die Datenvorlagen sehen. Aber ich kann sie dort nicht bearbeiten. Ich muss zurück zur Registerkarte "Ressourcen" wechseln und sie dort auswählen, um sie bearbeiten zu können. Und dort ist es nur ein leeres Rechteck. Übersehe ich hier etwas? Ich würde gerne vermeiden, dass ich zwischen dem Fenster und der Ressource hin- und herwechseln muss.

0 Stimmen

Normalerweise würden Sie von dem Steuerelement aus testen, das die Vorlage angezeigt hat, aber das würde dazu führen, dass Sie zwischen der Bearbeitung der Ressource und der Betrachtung des Ergebnisses in der Hosting-Ansicht hin- und herwechseln müssten (wie Sie gesagt haben). Ich habe meinen Beitrag mit einem Beispiel aktualisiert, das den Datenkontext für die Vorlage mit einem Border festlegt. Das ist nicht ideal. Ich werde weiter nachforschen, aber das sollte für Sie funktionieren.

0 Stimmen

Ich habe sie aktualisiert und die Umrandung entfernt. Für jedes Element, das Sie Datenkontext auf, würden Sie dies tun, so dass, wenn Sie mehr als ein übergeordnetes Element in Ihrem datatemplate haben, würden Sie d gesetzt:DataContext für jeden. Wenn Sie ein übergeordnetes visuelles Element (wie Border) haben, würden Sie d:DataContext auf nur, dass und alle Unterelemente erhalten, dass Datacontext. Hoffentlich hilft das.

1voto

bitbonk Punkte 47246

Mit dieser Strategie können Sie sehen wie das DataTemplate funktionieren wird, während direkt bearbeiten, aber Sie werden nicht können Sie das Ergebnis in jeder Ansicht sehen die das DataTemplate verwendet, es sei denn Sie die Anwendung tatsächlich ausführen. Dies ist eine Einschränkung von Blend im Moment, da der Tatsache geschuldet, dass sie anscheinend nicht Mocks zu verwenden, sondern eher komplette Ersatzobjekte. Wenn Blend jemals die Fähigkeit hinzufügt, eine neue Fälschung zu erstellen Datenquelle durch Klicken auf "New DataSource -> Basierend auf referenziertem Objekt -> MyCustomerObject", dann sind Sie im Geschäft sein.

Wenn ich acutal ViewModel mocks verwenden möchten, ich denke, es ist der beste Weg, um tatsächliche ViewModel-Instanzen zu erstellen und die Referenzen Sie mit d:DataContext (z.B. mit einem ObjectDataProvider oder x:Static)

0 Stimmen

Gut gemacht, ja. Ich habe einen Abschnitt "Alternative" veröffentlicht, der Informationen zu diesem Ansatz enthält.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X