XAML 绑定到 CompositeCollection [英] XAML binding to CompositeCollection

查看:22
本文介绍了XAML 绑定到 CompositeCollection的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在单个视图中只有一个数据网格,但是作为该数据网格的 ItemsSource 的集合位于不同的视图模型中.那么是否可以将视图中的单个数据网格与两个不同视图模型中的集合绑定?

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

xml:

DataContext="{DynamicResource ViewModelCombine}"><窗口.资源><vm:ViewModelCombine x:Key="ViewModelCombine"/></Window.Resources><网格><Grid.RowDefinitions><RowDefinition Height="自动"/></Grid.RowDefinitions><数据网格><DataGrid.Resources><CollectionViewSource x:Key="ViewModelPulse" Source="{Binding VP}"/><CollectionViewSource x:Key="ViewModeltherapy" Source="{Binding VT}"/></DataGrid.Resources><DataGrid.ItemsSource><复合集合><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></网格>

xaml.cs:

public MainWindow(){初始化组件();ViewModelCombine VMC = new ViewModelCombine();this.DataContext = VMC;}

ViewModelCombine.cs

公共类ViewModelCombine{公共 ViewModelTherapy VT { 得到;放;}公共 ViewModelPulse VP { 得到;放;}公共 ViewModelCombine(){VT = 新的 ViewModelTherapy();VP = new ViewModelPulse();}}

根据上面的代码,它显示如下

I have only one datagrid in a single view but the collections which are ItemsSource's of this datagrid are in different View Models. So is it possible to bind this single datagrid in view with the collections in two different View Models?

For each row in the grid, display an item from one collection, and an item from the other collection..! to display all columns in one row.

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

} 

As per the above code, it displays like this Output..but, wanted to display all columns in one row.

So is it possible to bind this single datagrid in view with the collections in two different View Models?

Thanks for your help.

解决方案

And here is a working example of your code. I replaced the Itemsource of the Datagrid and made ViewModelTherapy and ViewModelPulse to Observable collections.

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>

And here is a screenshot of the result

这篇关于XAML 绑定到 CompositeCollection的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆