首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XAML绑定到CompositeCollection

XAML绑定到CompositeCollection
EN

Stack Overflow用户
提问于 2016-10-19 06:44:18
回答 2查看 6.6K关注 0票数 1

我在一个视图中只有一个数据集,但是这个数据集的ItemsSource集合在不同的视图模型中。那么,是否可以将视图中的单个数据集与两个不同的视图模型中的集合绑定?

对于网格中的每一行,从一个集合显示一个项,从另一个集合显示一个项..!若要显示一行中的所有列,请执行以下操作。

xaml:

代码语言:javascript
复制
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:

代码语言:javascript
复制
public MainWindow() 
{ 
    InitializeComponent(); 
    ViewModelCombine VMC = new ViewModelCombine(); 
    this.DataContext = VMC; 
} 

ViewModelCombine.cs

代码语言:javascript
复制
public class ViewModelCombine 
{ 
    public ViewModelTherapy VT { get; set; } 
    public ViewModelPulse VP { get; set; }

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

} 

按照上面的代码,它的显示方式类似于这个输出..but,希望在一行中显示所有的列。

那么,是否可以将视图中的单个数据集与两个不同的视图模型中的集合绑定?

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-20 07:06:23

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

代码:

代码语言:javascript
复制
 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:

代码语言:javascript
复制
<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>

下面是结果的截图

票数 4
EN

Stack Overflow用户

发布于 2016-10-19 13:42:42

你试过以下几种方法:

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

代码语言:javascript
复制
public MainWindow() 
{ 
    InitializeComponent(); 
    ViewModelCombine VMC = new ViewModelCombine(); 
    dgr.DataContext = VMC; 
} 

Xaml:

代码语言:javascript
复制
<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> 

更新:

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

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

代码语言:javascript
复制
<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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40124054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档