【问题标题】:Binding a grid with two datasources in silverlight在 silverlight 中将网格与两个数据源绑定
【发布时间】:2011-05-12 14:30:18
【问题描述】:

我对如何以最佳方式绑定我的数据网格有疑问。

问题是我想使用两个 itemSources。 我有一个包含很多事件的列表,每个事件都有一个错误列表。 我想做的是将半个 gridview 行与事件中的一些字段绑定,并将一半网格与事件所包含的相应错误绑定。

我怎样才能以最好的方式做到这一点?

我可以访问 componentOne 数据网格,但如果正常网格工作,一切都很好。

但我确实想要一个排序能力。

谢谢

【问题讨论】:

    标签: silverlight datagrid silverlight-4.0


    【解决方案1】:

    听起来你只是想确保你没有AutoGenerateColumns="True"

    <sdk:DataGrid AutoGenerateColumns="False">    
            <sdk:DataGrid.Columns>
                <sdk:DataGridTextColumn 
                    Header="ItemSource1Property1Name" 
                    Width="SizeToHeader"
                    Binding="{Binding ItemSource1.Property1}" 
                    FontSize="20" />
                <sdk:DataGridTextColumn 
                    Header="ItemSource1Property2Name" 
                    Width="SizeToHeader"
                    Binding="{Binding ItemSource1.Property2}" 
                    FontSize="20" />
                <sdk:DataGridTextColumn 
                    Header="ItemSource2Property1Name" 
                    Width="SizeToCells"
                    Binding="{Binding ItemSource2.Property1}" 
                    FontSize="20" />
            </sdk:DataGrid.Columns>
            .
            .
            .
            Rest of Code
            .
            .
            .
    </sdk:DataGrid>
    

    编辑

    如果您选择为您的项目源使用包装器,那么您的代码中将包含以下内容:

    public class ItemWrapper
    {
        ObservableCollection<ItemSource1Type> ItemSource1 {get;set;}
        ObservableCollection<ItemSource2Type> ItemSource2 {get;set;}
    }
    

    然后在你的视图模型或代码后面(你想设置你想绑定的属性的地方):

    public class ViewModel //This may just end up being your code behind depending on how you have your entire SL project set up.
    {
        ItemWrapper ItemWrapper { get; set; } //set the two properties either in the constructor or in whatever code initializes ViewModel.
    }
    

    在您的 xaml 中:

    <sdk:DataGrid AutoGenerateColumns="False" 
                  ItemSource="{Binding ItemWrapper}"
                  DataContext="{Binding}">    
            <sdk:DataGrid.Columns>
                <sdk:DataGridTextColumn 
                    Header="ItemSource1Property1Name" 
                    Width="SizeToHeader"
                    Binding="{Binding ItemSource1.Property1}" 
                    FontSize="20" />
    

    【讨论】:

    • 嘿,感谢您的输入,但是这个 ItemSourceWrapper 看起来如何,请在后面添加一些代码,以便我可以看到如何将我的两个源添加到包装器中。谢谢
    • 哦,对不起,我本来打算把它拿出来的。如果您不自动生成列,我认为您不需要 ItemSource。编辑以反映这一点。
    • 另一种选择是制作一个简单的包装器,为您的两个项目来源的每种类型设置两个属性。然后,您可以将项目源设置为该包装器,并使用相同的点表示法引用包装器中的每个项目源
    【解决方案2】:

    我同意 Kavet 的想法,但他的解决方案与现实相去甚远。 根据http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemssource(v=vs.95).aspx

    ItemSourse 必须实现 IEnumerable 接口。

    这意味着您的 ItemWrapper 根本无法工作。

    你试过运行这个吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-16
      • 2012-01-20
      • 2014-04-14
      • 1970-01-01
      • 2011-10-29
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多