Ich bin neu bei WPF und folge diesem Link, um Code-Methode zu verwenden, um das Beispiel zu erstellen. Und das Beispiel funktioniert. https://msdn.microsoft.com/en-us/data/jj574514.aspxWPF - So binden Sie ICollectionView mit MVRM an Datenagenten
Jetzt versuche ich es zu ändern MVVM zu folgen. Hier
ist das Hauptfenster XAML
<Window
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" xmlns:local="clr-namespace:WPFwithEFSampleCodeFirst" mc:Ignorable="d" x:Class="WPFwithEFSampleCodeFirst.MainWindow"
Title="MainWindow" Height="352.134" Width="517.53" Loaded="Window_Loaded">
<Grid Margin="0,0,0,-3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0*"/>
<ColumnDefinition Width="77*"/>
<ColumnDefinition Width="25*"/>
</Grid.ColumnDefinitions>
<Button Content="Save" Grid.Column="2" HorizontalAlignment="Left" Margin="41,167,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
<DataGrid Grid.ColumnSpan="2" ItemsSource="{Binding Categories}" AutoGenerateColumns="False" HorizontalAlignment="Left" Margin="32,10,0,0" VerticalAlignment="Top" Height="124" Width="330" >
<DataGrid.Columns>
<DataGridTextColumn Width="SizeToHeader" Header="Category Id" Binding="{Binding Path = CategoryId}"/>
<DataGridTextColumn Width="SizeToHeader" Header="Name" Binding="{Binding Path = Name}"/>
</DataGrid.Columns>
</DataGrid>
<DataGrid Grid.ColumnSpan="2" AutoGenerateColumns="False" HorizontalAlignment="Left" Margin="32,153,0,0" VerticalAlignment="Top" Height="146" Width="330">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding CategoryId}" Header="Category Id" Width="SizeToHeader"/>
<DataGridTextColumn Binding="{Binding Name}" Header="Name" Width="SizeToHeader"/>
<DataGridTextColumn Binding="{Binding ProductId}" Header="Product Id" Width="SizeToHeader"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
Hier die MainWindowViewModel ist
class MainWindowViewModel
{
private ICollectionView _categoryView;
public ICollectionView Categories
{
get { return _categoryView; }
}
ProductContext context = new ProductContext();
public MainWindowViewModel()
{
IList<Category> categories = GetCategories();
_categoryView = CollectionViewSource.GetDefaultView(categories);
}
public IList<Category> GetCategories()
{
return context.Categories.ToList();
}
}
Ich weiß nicht, wie die zweiten Details Datagrid Ansichtsmodell zu binden. Ich möchte die gleiche Master-Details-Anzeigefunktion wie das ursprüngliche Beispiel haben.
So, wie Produkte in Kategorien an das zweite Datagrid gebunden werden? Was ist der richtige Weg, um MVVM zu implementieren?
Weitere Informationen:
public class Category
{
public Category()
{
this.Products = new ObservableCollection<Product>();
}
public int CategoryId { get; set; }
public string Name { get; set; }
public virtual ObservableCollection<Product> Products { get; private set; }
}
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
}
public class ProductContext : DbContext
{
public DbSet<Category> Categories { get; set; }
public DbSet<Product> Products { get; set; }
}
Ich habe zwei Dinge in Ihrem Code geändert und es hat funktioniert. 1. Der Typ von SelectedCategoryProducts sollte ObservableCollection anstelle von Kategorie 2 sein. Die Details der Datagird-Bindung werden geändert in ItemsSource = "{Binding SelectedCategoryProducts}" anstelle von DataContext = "{Binding SelectedCategoryProducts, ElementName = MasterGrid}" –
Das ursprüngliche Beispiel verwendet Drag-and-Drop-Datenquellen Methode, um die beiden Master-Details Datagrids zu binden, die sehr einfach ist. Wenn wir es auf MVVM verschieben, scheint es keinen einfachen Weg zu geben und an öffentliche Objekte zu binden. –