C# XAML绑定到CompositeCollection
我在一个视图中只有一个datagrid,但是作为该datagrid的ItemsSource的集合在不同的视图模型中。所以,有可能将视图中的单个datagrid与两个不同视图模型中的集合绑定吗 对于网格中的每一行,显示一个集合中的项目,以及另一个集合中的项目。。!在一行中显示所有列 xaml: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
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>