Dies ist mein erster Versuch, das MVVM-Modell zu implementieren, also im Voraus zu entschuldigen. Ich habe ein Hauptfenster mit einem eigenen ViewModel. Das Hauptfenster hat dann drei Benutzersteuerungen, die je nach Auswahl im Navigationsmenü geladen werden. Der Datenkontext ändert sich jedoch nicht in das richtige Ansichtsmodell.So fügen Sie den Benutzersteuerelementen im Hauptfenster mehrere ViewModels hinzu
MainWindow.xaml
<Window.DataContext>
<VM:MainVM></VM:MainVM>
</Window.DataContext>
<Window.Resources>
<DataTemplate x:Key="View1Template" DataType="{x:Type VM:CustomerVM}">
<View:Customers DataContext="{Binding VM:CustomerVM}" />
</DataTemplate>
<DataTemplate x:Key="View2Template" DataType="{x:Type VM:SuppliersVM}">
<View:Suppliers DataContext="{Binding VM:Suppliers}"/>
</DataTemplate>
</Window.Resources>
<ContentControl Margin="0,135,0,10" Grid.Column="1">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{StaticResource View1Template}" />
<Style.Triggers>
<DataTrigger Binding="{Binding SwitchView}" Value="0">
<Setter Property="ContentTemplate" Value="{StaticResource View1Template}" />
</DataTrigger>
<DataTrigger Binding="{Binding SwitchView}" Value="1">
<Setter Property="ContentTemplate" Value="{StaticResource View2Template}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
dies sein eigenes Ansichtsmodell hat und Navigation lädt die Ansicht richtig, aber ich einen Befehl habe, die auf Last läuft und seine nicht durchgeführt wird. Dies füllt nur eine Listenansicht. Ich weiß, dass es funktioniert, weil, wenn ich den datacontext des Fensters entferne und es als einstelle, das listview bevölkert wird, aber Navigation funktioniert nicht mehr, weil MainVM
entfernt worden ist.
Customer.xaml
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding LoadCustomersCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
<Grid>
<TextBox Tag="Search Customers" x:Name="searchTextBox" Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" HorizontalAlignment="Left" Height="40" Margin="10,9,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="340" Padding="5,6,0,0" FontSize="16"/>
<Label Content="{Binding Path=SearchText}" Margin="430,0,436,263" />
<ListView ItemsSource="{Binding Customers}" x:Name="customerListBox" Margin="10,57,10,10" AlternationCount="2" >
<ListView.View>
<GridView>
<GridViewColumn Header="ID" Width="Auto" DisplayMemberBinding="{Binding id}" />
<GridViewColumn Header="NAME" Width="Auto" DisplayMemberBinding="{Binding name}" />
<GridViewColumn Header="ADDRESS" Width="Auto" DisplayMemberBinding="{Binding address1}" />
<GridViewColumn Header="ADDRESS 2" Width="150" DisplayMemberBinding="{Binding address2}" />
<GridViewColumn Header="TOWN" Width="150" DisplayMemberBinding="{Binding town}" />
<GridViewColumn Header="COUNTY" Width="150" DisplayMemberBinding="{Binding county}" />
<GridViewColumn Header="POSTCODE" Width="150" DisplayMemberBinding="{Binding postcode}" />
<GridViewColumn Header="PHONE" Width="150" DisplayMemberBinding="{Binding phone}" />
<GridViewColumn Header="EMAIL" Width="150" DisplayMemberBinding="{Binding email}" />
</GridView>
</ListView.View>
</ListView>
</Grid>
CustomerVM.cs
private string _searchText;
private readonly ObservableCollection<Customer> _customers = new ObservableCollection<Customer>();
public string Title = "Customers";
public string SearchText
{
get { return _searchText; }
set
{
_searchText = value;
RaisePropertyChangedEvent("SearchText");
}
}
public IEnumerable<Customer> Customers
{
get { return _customers; }
}
public ICommand LoadCustomersCommand
{
get { return new DelegateCommand(LoadCustomers); }
}
public void LoadCustomers()
{
Customer cus = new Customer { id = 1, name = "sam" };
_customers.Add(cus);
}
MainVM.cs
public ICommand NavigationClick
{
get { return new DelegateCommand(Navigate); }
}
public void Navigate()
{
SwitchView = 1;
}
Bitte zeigen Sie, wie diese DataTemplates im XAML verwendet werden. Sie müssen den DataContext nicht explizit für die Ansicht in der Vorlage festlegen. Es wird den DataContext der Datenplatte erben. Was bedeutet 'DataContext =" {Binding VM: CustomerVM} "? Versuchen Sie, es zu typisieren? –
Danke für das Update. Woher bezieht das ContentControl seinen 'Content'? –
Ich habe die Frage aktualisiert, wie die Ansicht geladen wird. Das 'CustomerVM' ist das ViewModel für die Kunden-Benutzersteuerungsansicht. – Bish25