Was ist der Vorteil der Einstellung DataContext im code anstelle von XAML?
Scheint es zwei Möglichkeiten zu definieren DataContext in WPF:
- entweder in code wie diese:
App.xaml.cs (entnommen aus der WPF-MVVM Toolkit Vorlage):
public partial class App : Application
{
private void OnStartup(object sender, StartupEventArgs e)
{
//Create the ViewModel and expose it using the View's DataContext
MainView mainView = new MainView();
MainViewModel mainViewModel = new MainViewModel();
mainViewModel.LoadCustomers("c:\\testdata2\\Customers.xml");
mainView.DataContext = mainViewModel;
mainView.Show();
}
}
- oder in XAML wie diese:
Window1.xaml:
<DockPanel>
<StackPanel
HorizontalAlignment="Left"
DockPanel.Dock="Top"
Orientation="Horizontal">
<StackPanel.DataContext>
<local:CustomerViewModel />
</StackPanel.DataContext>
<TextBlock Text="{Binding Path=FirstName}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding Path=LastName}" />
</StackPanel>
<StackPanel
HorizontalAlignment="Left"
VerticalAlignment="top"
DockPanel.Dock="Top"
Orientation="Horizontal">
<ListBox ItemsSource="{Binding Source={StaticResource FileNames}}" />
</StackPanel>
<StackPanel
HorizontalAlignment="Left"
VerticalAlignment="top"
DockPanel.Dock="Top"
Orientation="Horizontal">
<ComboBox
ItemsSource="{Binding Source={StaticResource Directories}}"
SelectedIndex="0" />
</StackPanel>
<StackPanel
HorizontalAlignment="Left"
VerticalAlignment="top"
DockPanel.Dock="Top"
Orientation="Horizontal">
<StackPanel.DataContext>
<local:SystemInformationViewModel />
</StackPanel.DataContext>
<TextBlock Text="{Binding Path=CurrentTime}" />
</StackPanel>
</DockPanel>
Den Vorteil, dass die Festlegung des DataContext im XAML hat, ist, dass Ihre Daten zeigen, bis in Expression Blend design-Modus und Expression Blend können Sie tun eine ganze Menge innerhalb der GUI Z. B. wählen Sie die Felder aus Ihrer Datenquelle, etc. wie hier gezeigt.
Habe ich gelesen, dass die Bindung ADO.NET Objekte können nicht gebunden werden, in XAML (obwohl ich nicht sehen, warum Sie schreiben, könnte eine minimale wrapper für die Sie sich binden konnte von XAML).
Seltsam, dass die WPF-Team in die WPF-MVVM-Vorlagen definieren Sie die DataContext-in-codedie sehr schnell macht es nicht praktikabel, zu Bearbeiten und Ihre Ansichten in Expression Blend, da Ihre Daten nicht zeigen, bis in der design-Modus ist oft ein wichtiger Teil des Layouts.
Also ich denke, es muss einen Vorteil die Straße hinunter, um die Einstellung der DataContext im code anstelle von XAML, wer weiß, was es ist?
InformationsquelleAutor der Frage Edward Tanguay | 2009-05-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie (vielleicht im Jahr 2009 konnte man Sie nicht) erhalten das beste aus beiden Welten, indem Sie mit der
d:DataContext
Attribut. Sie brauchen das nicht, dieViewModelLocator
Wahnsinnwenn Sie nicht bereit für das noch 🙂Stellen Sie zunächst sicher, dass Sie den folgenden XML-Namensraum definiert in Ihrem root-element:
Dann können Sie fügen Sie das folgende Attribut auf ein element in der xaml:
d:DataContext="{d:DesignInstance IsDesignTimeCreatable=True, Type=vm:CustomerInsightViewModel}"
In der xaml-codebehind :
Dann in deinem ViewModel:
Verpassen Sie nicht die
IsDesignTimeCreatable=True
oder andere Mischung nicht instanziieren der KlasseInformationsquelleAutor der Antwort Simon_Weaver
Ich weiß nicht, wie die Idee des habens von Expression Blend versuchen zu instanziieren meine Daten-Objekte.
Ich DataContext nicht über den code, wo ich in der Lage bin, um Dependency Injection zu injizieren, die richtigen Objekte, Dienste, Anbieter oder was anderes ich bin mit meinen code.
InformationsquelleAutor der Antwort HakonB
Dass es im codebehind macht es leicht zu injizieren und die datacontext mit Einheit.
InformationsquelleAutor der Antwort Ali Shafai
Könnte es eine Art von Lösung, mit der DataObjectProvider Maske die Tatsache, dass die Daten instanziiert wird, die außerhalb des XAML.
Wird es sagen, was der Typ von der DataContext ist, was genug sein sollte für die Mischung zu Holen, die Eigenschaften.
Ich habe nicht versucht es noch, also nehmen Sie es mit einem Körnchen Salz, aber es ist sicherlich eine Untersuchung Wert.
InformationsquelleAutor der Antwort Denis Troller
Siehe Rob ' s Artikel über die design-time-Daten in Mischung: http://www.robfe.com/2009/08/design-time-data-in-expression-blend-3/
InformationsquelleAutor der Antwort Dave
Sollte es auch möglich sein, an ObjectDataProvider der Aufbau einer Objekt-Fabrik mithilfe von Unity oder andere IOCs als hier angedeutet...
http://social.msdn.microsoft.com/Forums/en/wpf/thread/1ff9e90e-302e-436e-bab3-ca4bad2b85af
insbesondere...
http://www.codeproject.com/Articles/43806/WPF-Ninject-Dojo-The-Data-Provider.aspx
InformationsquelleAutor der Antwort George
In meiner Erfahrung ist es am besten, um eine Schnittstelle entwerfen, layout gegen mindestens eine Stichprobe der Daten, die Sie präsentieren werden. Etwas anderes zu tun ist, blind zu sein, um Billig Einsichten und teure Versäumnisse.
InformationsquelleAutor der Antwort George