2016-10-19 3 views
0

Ich habe nur ein Datagrid in einer einzigen Ansicht, aber die Sammlungen, die ItemsSource dieses Datagrid sind in verschiedenen Ansichtsmodellen. Ist es also möglich, dieses einzelne DataGrid mit den Kollektionen in zwei verschiedenen View-Modellen zu verbinden?XAML Bindung an CompositeCollection

Zeigen Sie für jede Zeile im Raster einen Artikel aus einer Sammlung und einen Artikel aus der anderen Sammlung an ..! um alle Spalten in einer Zeile anzuzeigen.

XAML:

DataContext="{DynamicResource ViewModelCombine}"> 

<Window.Resources> 
    <vm:ViewModelCombine x:Key="ViewModelCombine"/> 
</Window.Resources> 

<Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 

    <DataGrid> 

      <DataGrid.Resources> 
       <CollectionViewSource x:Key="ViewModelPulse" Source="{Binding VP}"/> 
       <CollectionViewSource x:Key="ViewModeltherapy" Source="{Binding VT}"/> 
      </DataGrid.Resources> 

      <DataGrid.ItemsSource> 
       <CompositeCollection> 
        <CollectionContainer Collection="{Binding Source={StaticResource ViewModelCombine}, Path=VP}" /> 
        <CollectionContainer Collection="{Binding Source={StaticResource ViewModelCombine}, Path=VT}" /> 
       </CompositeCollection> 
      </DataGrid.ItemsSource> 

      <DataGrid.Columns> 
       <DataGridTextColumn Header="AMP" Binding="{Binding AMP}" Width="100"/> 
       <DataGridTextColumn Header="PW" Binding="{Binding PW}" Width="100" /> 
       <DataGridTextColumn Header="DZ0" Binding="{Binding DZ0}" Width="100" /> 
       <DataGridTextColumn Header="DELTA" Binding="{Binding DELTA}" Width="100" /> 
       <DataGridTextColumn Header="DZ1" Binding="{Binding DZ1}" Width="100"/> 
       <DataGridTextColumn Header="M" Binding="{Binding M}" Width="100" /> 
       <DataGridTextColumn Header="DZ2" Binding="{Binding DZ2}" Width="100" /> 
       <DataGridTextColumn Header="N" Binding="{Binding N}" Width="100" /> 
      </DataGrid.Columns> 

    </DataGrid> 

</Grid> 

xaml.cs:

public MainWindow() 
{ 
    InitializeComponent(); 
    ViewModelCombine VMC = new ViewModelCombine(); 
    this.DataContext = VMC; 
} 

ViewModelCombine.cs

public class ViewModelCombine 
{ 
    public ViewModelTherapy VT { get; set; } 
    public ViewModelPulse VP { get; set; } 

    public ViewModelCombine() 
    { 
     VT = new ViewModelTherapy(); 
     VP = new ViewModelPulse(); 
    } 

} 

Gemäß dem obigen Code, zeigt es wie dieses Output ..aber wollte um alle Spalten in einer Zeile anzuzeigen.

So ist es möglich, dieses einzelne DataGrid in Sicht mit den Sammlungen in zwei verschiedenen Ansichtsmodellen zu verbinden?

Danke für Ihre Hilfe.

Antwort

1

Und hier hilft, ist ein funktionierendes Beispiel des Codes. Ich ersetzte die Itemsource des Datagrids und machte ViewModelTherapy und ViewModelPulse zu Observable-Sammlungen.

Code:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 


     ViewModelCombine VMC = new ViewModelCombine(); 
     VMC.VP.Add(new ViewModelPulse() { ID = 1, Name = "test1", xaxa = "xaxa" }); 
     VMC.VT.Add(new ViewModelTherapy() { ID = 2 Name = "test2", Description = "desc" }); 
     this.DataContext = VMC; 
    } 

} 

public class ViewModelCombine 
{ 
    public ObservableCollection<ViewModelTherapy> VT { get; set; } 
    public ObservableCollection<ViewModelPulse> VP { get; set; } 

    public ViewModelCombine() 
    { 
     VT = new ObservableCollection<ViewModelTherapy>(); 
     VP = new ObservableCollection<ViewModelPulse>(); 
    } 

} 

public class ViewModelTherapy 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 

} 

public class ViewModelPulse 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string xaxa { get; set; } 

} 

XAML:

<Window.Resources> 
    <CollectionViewSource x:Key="ViewSource1" Source="{Binding VT}"/> 
    <CollectionViewSource x:Key="ViewSource2" Source="{Binding VP}"/> 

    <CompositeCollection x:Key="CombinedCollection"> 
     <CollectionContainer Collection="{Binding Source={StaticResource ViewSource1}}" /> 
     <CollectionContainer Collection="{Binding Source={StaticResource ViewSource2}}" /> 
    </CompositeCollection> 
</Window.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 

    <DataGrid ItemsSource="{StaticResource CombinedCollection}"> 


     <DataGrid.Columns> 
      <DataGridTextColumn Header="AMP" Binding="{Binding ID}" Width="100"/> 
      <DataGridTextColumn Header="PW" Binding="{Binding Name}" Width="100" /> 
      <DataGridTextColumn Header="DZ0" Binding="{Binding xaxa}" Width="100" /> 
      <DataGridTextColumn Header="DELTA" Binding="{Binding Description}" Width="100" /> 
     </DataGrid.Columns> 

    </DataGrid> 

</Grid> 

Und hier ist ein Screenshot des Ergebnisses

enter image description here

+0

Beachten Sie, dass VP hat: FirstName, LastName & VT hat: ID, Gehalt als Eigenschaften..Sollte alle Eigenschaften in einer Zeile anzeigen (Nicht wie VP Eigenschaften in einer Zeile und VT-Eigenschaften in einer anderen Zeile, oben zur Verfügung gestellt) ..Vielen Dank. – Kumar

+0

Dann nehme ich an, dass das, was Sie wollen, nicht mit mir oder Ihrem Ansatz möglich ist. Ich würde vorschlagen, eine neue Sammlung zu erstellen, die VP und VT basierend auf ihren IDs zu einem neuen Objekt kombiniert (wenn möglich mit linq). Und binden Sie diese neue Sammlung an das Datagrid. Andernfalls werden bei der Verwendung von Composite collection 2 Kollektionen zu einem kombiniert, aber Sie werden ihre Eigenschaften nicht kombinieren, was ich denke, was Sie tun möchten. –

+0

Es wurde versucht, zwei ObservableCollections zusammenzuführen und Datagrid mit dieser MergedCollection zu verbinden..Bitte verweisen Sie auf diesen Link. http://stackoverflow.com/q/40147381/7040506 – Kumar

0

Haben Sie versucht, die folgenden:

ersten Satz der Datagrid Itemssource zu ViewModelCombine. Dann nehmen Sie die folgenden Änderungen in XAML (Dieses Beispiel ist nur eine Demonstration, denn ich weiß nicht, welche Werte enthalten sind, in VT und VP, aber ich glaube, Sie dies herausfinden könnte):

public MainWindow() 
{ 
    InitializeComponent(); 
    ViewModelCombine VMC = new ViewModelCombine(); 
    dgr.DataContext = VMC; 
} 

XAML:

<Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 

    <DataGrid x:Name="dgr"> 

      <DataGrid.Resources> 
      <CollectionViewSource x:Key="ViewModelPulse" Source="{Binding VP}"/> 
      <CollectionViewSource x:Key="ViewModeltherapy" Source="{Binding VT}"/> 
     </DataGrid.Resources> 

     <DataGrid.ItemsSource> 
      <CompositeCollection> 
       <CollectionContainer Collection="{Binding Source={StaticResource ViewModelCombine}, Path=VP}" /> 
       <CollectionContainer Collection="{Binding Source={StaticResource ViewModelCombine}, Path=VT}" /> 
      </CompositeCollection> 
     </DataGrid.ItemsSource> 


      <DataGrid.Columns> 
       <DataGridTextColumn Header="AMP" Binding="{Binding VT.AMP}" Width="100"/> 
       <DataGridTextColumn Header="PW" Binding="{Binding VP.PW}" Width="100" /> 
       <DataGridTextColumn Header="DZ0" Binding="{Binding VP.DZ0}" Width="100" /> 
       <DataGridTextColumn Header="DELTA" Binding="{Binding VP.DELTA}" Width="100" /> 
       <DataGridTextColumn Header="DZ1" Binding="{Binding VT.DZ1}" Width="100"/> 
       <DataGridTextColumn Header="M" Binding="{Binding VP.M}" Width="100" /> 
       <DataGridTextColumn Header="DZ2" Binding="{Binding VP.DZ2}" Width="100" /> 
       <DataGridTextColumn Header="N" Binding="{Binding VP.N}" Width="100" /> 
      </DataGrid.Columns> 

    </DataGrid> 

</Grid> 

UPDATE:

in diesem Link ein sehr gutes Beispiel für die Verbund Sammlungen in wpf finden. Es enthält eine Lösung mit Listview, Listbox und Gridview.

https://code.msdn.microsoft.com/windowsdesktop/Combining-item-sources-in-65408473

<Window.Resources> 
     <!--Collection views for the ObservableCollections in the view model or code behind.--> 
     <CollectionViewSource x:Key="BooksViewSource" Source="{Binding Books}"/> 
     <CollectionViewSource x:Key="MoviesViewSource" Source="{Binding Movies}"/> 
     <CollectionViewSource x:Key="AlbumsViewSource" Source="{Binding Albums}"/> 

     <!--Combine the colection views into a single composite collection--> 
     <CompositeCollection x:Key="CombinedCollection">    
      <CollectionContainer Collection="{Binding Source={StaticResource BooksViewSource}}" /> 
      <CollectionContainer Collection="{Binding Source={StaticResource MoviesViewSource}}" /> 
      <CollectionContainer Collection="{Binding Source={StaticResource AlbumsViewSource}}" /> 
     </CompositeCollection>    
    </Window.Resources> 

Und dann binden sie die Sammlung zu den Kontrollen. Ich möchte erwähnen, dass Sie in Ihrem Code die Listen vermissen. Die Klassen ViewModelPulse und ViewModeltherapy sind keine Listen von Objekten, so dass Ihre Bindung nicht funktionieren kann (da ich ihre Definitionen in Ihrer Frage nicht sehen kann).

Hoffnung, die

+0

früher das gleiche versucht haben, zeigt nichts in diesem Fall. .! Vielen Dank. – Kumar

+0

Sie könnten auch versuchen, den Pfad in Binding = "{Binding Path = VT.AMP}" zu setzen. Erhalten Sie verbindliche Fehler im Ausgabefenster? Ich habe die Antwort in XAML aktualisiert. Forgot to add the resources und item source –

+0

Nichts/keine Daten anzeigen, mit Binding = "{Binding VT.AMP}" und Binding = "{Binding Path = VT.AMP}" und auch keine Binding errors..dhanks .. ! – Kumar

Verwandte Themen