2016-10-19 3 views
0

У меня есть только один datagrid в одном представлении, но коллекции, которые являются ItemsSource этого набора данных, находятся в разных моделях просмотра. Можно ли связать этот единственный datagrid с коллекциями в двух разных моделях?Связывание XAML с CompositeCollection

Для каждой строки в сетке отобразите элемент из одной коллекции и элемент из другой коллекции ..! для отображения всех столбцов в одной строке.

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(); 
    } 

} 

В соответствии с выше код, он показывает, как этот Output ..но, хотел для отображения всех столбцов в одной строке.

. Можно ли связать этот единственный datagrid с коллекциями в двух разных моделях?

Благодарим за помощь.

ответ

1

А вот рабочий пример кода. Я заменил Itemource of Datagrid и сделал коллекции ViewModelTherapy и ViewModelPulse для наблюдаемых.

Код:

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> 

А вот скриншот результата

enter image description here

+0

. Учтите, что у VP есть: FirstName, LastName & VT имеет: ID, Salary as properties..Should отображать все свойства в одной строке (не как свойства VP в одной строке и свойства VT в другой строке, приведенные выше) ..благодаря. – Kumar

+0

Тогда я полагаю, что то, что вы хотите, невозможно с моим или вашим подходом. Я бы предложил создать новую коллекцию, которая объединила бы VP и VT на основе их идентификаторов в один новый объект (если возможно, используя linq). И привяжите эту новую коллекцию к datagrid. В противном случае, используя композицию Composite, вы объедините две коллекции в одну, но вы не будете комбинировать их свойства, которые, я думаю, вы хотите сделать. –

+0

Пробовал объединить два ObservableCollections и привязать Datagrid с помощью этого MergedCollection. Пожалуйста, обратитесь к этой ссылке. http://stackoverflow.com/q/40147381/7040506 – Kumar

0

Вы пробовали следующее:

Сначала установите DataGrid ItemsSource в ViewModelCombine. Затем сделайте следующие изменения в XAML (Этот пример является лишь демонстрацией, потому что я не знаю, какие значения включены в VT и VP, но я думаю, что вы могли бы понять это):

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:

В этой ссылке вы найдете очень хороший пример для композитных коллекций в МОФ. Он включает решение с Listview, Listbox и 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> 

А потом они связывают коллекцию с элементами управления. Я хотел бы упомянуть, что в вашем коде вам не хватает списков. Классы ViewModelPulse и ViewModeltherapy не являются списками объектов, поэтому ваша привязка не может работать (поскольку я не могу видеть их определения в вашем вопросе).

Надежда, что помогает

+0

Ранее попробовали то же самое, ничего не отображает в этом случае. .! Благодарю. – Kumar

+0

Вы также можете попробовать установить путь в Binding = "{Binding Path = VT.AMP}". Получаете ли вы ошибки привязки в окне вывода? Я обновил ответ в xaml. Забыл добавить ресурсы и исходный код –

+0

Показывать ничего/нет данных, причем оба Binding = "{Binding VT.AMP}" и Binding = "{Binding Path = VT.AMP}", а также отсутствие ошибок привязки. ! – Kumar

Смежные вопросы