C# XAML绑定到CompositeCollection

C# XAML绑定到CompositeCollection,c#,wpf,xaml,mvvm,compositecollection,C#,Wpf,Xaml,Mvvm,Compositecollection,我在一个视图中只有一个datagrid,但是作为该datagrid的ItemsSource的集合在不同的视图模型中。所以,有可能将视图中的单个datagrid与两个不同视图模型中的集合绑定吗 对于网格中的每一行,显示一个集合中的项目,以及另一个集合中的项目。。!在一行中显示所有列 xaml: DataContext="{DynamicResource ViewModelCombine}"> <Window.Resources> <vm:ViewModelCo

我在一个视图中只有一个datagrid,但是作为该datagrid的ItemsSource的集合在不同的视图模型中。所以,有可能将视图中的单个datagrid与两个不同视图模型中的集合绑定吗

对于网格中的每一行,显示一个集合中的项目,以及另一个集合中的项目。。!在一行中显示所有列

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> 
ViewModelCombine.cs

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

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

} 
根据上面的代码,它显示如下..但是,希望在一行中显示所有列

所以,有可能将视图中的单个datagrid与两个不同视图模型中的集合绑定吗


谢谢您的帮助。

您是否尝试过以下方法:

首先将Datagrid itemssource设置为ViewModelCombine。然后在xaml中进行以下更改(这个示例只是一个演示,因为我不知道VT和VP中包含哪些值,但我认为您可以解决这个问题):

Xaml:


更新:

在这个链接中,您将发现wpf中复合集合的一个非常好的示例。它包括一个包含Listview、Listbox和Gridview的解决方案


然后将集合绑定到控件。我想提到的是,在你的代码中,你缺少列表。ViewModelPulse和ViewModelTheraphy类不是对象列表,因此绑定无法工作(因为我在您的问题中看不到它们的定义)


希望对您有所帮助您是否尝试过以下方法:

首先将Datagrid itemssource设置为ViewModelCombine。然后在xaml中进行以下更改(这个示例只是一个演示,因为我不知道VT和VP中包含哪些值,但我认为您可以解决这个问题):

Xaml:


更新:

在这个链接中,您将发现wpf中复合集合的一个非常好的示例。它包括一个包含Listview、Listbox和Gridview的解决方案


然后将集合绑定到控件。我想提到的是,在你的代码中,你缺少列表。ViewModelPulse和ViewModelTheraphy类不是对象列表,因此绑定无法工作(因为我在您的问题中看不到它们的定义)


希望这对您有所帮助,下面是一个代码的工作示例。我替换了Datagrid的Itemsource,并将ViewModelTherapy和ViewModelPulse设置为可观察的集合

代码:

公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
ViewModelCombine VMC=新的ViewModelCombine();
添加(newviewmodelpulse(){ID=1,Name=“test1”,xaxa=“xaxa”});
VMC.VT.Add(新的ViewModelTherapy(){ID=2 Name=“test2”,Description=“desc”});
this.DataContext=VMC;
}
}
公共类ViewModelCombine
{
公共可观测集合VT{get;set;}
公共可观测集合VP{get;set;}
公共ViewModelCombine()
{
VT=新的ObservableCollection();
VP=新的ObservableCollection();
}
}
公营医疗
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
}
公共类ViewModelPulse
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共字符串xaxa{get;set;}
}
Xaml:


下面是结果的屏幕截图


下面是一个代码的工作示例。我替换了Datagrid的Itemsource,并将ViewModelTherapy和ViewModelPulse设置为可观察的集合

代码:

公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
ViewModelCombine VMC=新的ViewModelCombine();
添加(newviewmodelpulse(){ID=1,Name=“test1”,xaxa=“xaxa”});
VMC.VT.Add(新的ViewModelTherapy(){ID=2 Name=“test2”,Description=“desc”});
this.DataContext=VMC;
}
}
公共类ViewModelCombine
{
公共可观测集合VT{get;set;}
公共可观测集合VP{get;set;}
公共ViewModelCombine()
{
VT=新的ObservableCollection();
VP=新的ObservableCollection();
}
}
公营医疗
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
}
公共类ViewModelPulse
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共字符串xaxa{get;set;}
}
Xaml:


下面是结果的屏幕截图


之前我们也尝试过同样的方法,但在这种情况下不显示任何内容。。!T
public class ViewModelCombine 
{ 
    public ViewModelTherapy VT { get; set; } 
    public ViewModelPulse VP { get; set; }

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

} 
public MainWindow() 
{ 
    InitializeComponent(); 
    ViewModelCombine VMC = new ViewModelCombine(); 
    dgr.DataContext = VMC; 
} 
<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> 
<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>
 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; }

}
<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>