首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WPF DataGrid: DataGridComboxBox ItemsSource绑定到集合集合

WPF DataGrid: DataGridComboxBox ItemsSource绑定到集合集合
EN

Stack Overflow用户
提问于 2009-10-27 21:31:03
回答 6查看 40K关注 0票数 11

情况:

我在XAML中创建了一个DataGrid,ItemsSource绑定到包含属性的特定类的ObservableCollection。然后在C#中创建一个DataGridTextColumn和一个DataGridComboBoxColumn,并将它们绑定到ObservableCollection中的对象的属性中。我可以将DataGridComboBoxColumn绑定到一个简单的集合,但是我想要做的是将它绑定到一个字符串集合,这样对于DataGrid中的每一行,DataGrid中的ComboBox都有一个不同的字符串集合。我没有这么做..。

问题:

如何绑定DataGridCombBoxColumn,以便为此类列的每一行拥有不同的字符串集合?

代码示例:

XAML:

代码语言:javascript
运行
复制
<Window>
  <!-- ... -->
  WPFToolkit:DataGrid
           x:Name="DG_Operations"
           Margin="10,5,10,5" 
           Height="100" 
           HorizontalAlignment="Stretch" 
           FontWeight="Normal" 
           ItemsSource="{Binding Path=OperationsStats}"
           AlternatingRowBackground="{DynamicResource SpecialColor}" 
           HorizontalScrollBarVisibility="Auto" 
           VerticalScrollBarVisibility="Visible" 
           SelectionMode="Extended"
           CanUserAddRows="False" 
           CanUserDeleteRows="False"
           CanUserResizeRows="True" 
           CanUserSortColumns="True"
           AutoGenerateColumns="False" 
           IsReadOnly="False" 
           IsEnabled="True"
           BorderThickness="1,1,1,1" 
           VerticalAlignment="Stretch"/>
  <!-- ... -->
</Window>

C#:

代码语言:javascript
运行
复制
public class DataModelStatsOperations
{
   public ObservableCollection<IStatsOperation> OperationsStats { get; set; }
}

public interface IStatsOperation
{
   string Operation { get; set; }
   Collection<string> Data{ get; set; }
}

public class StatsOperation : IStatsOperation
{
    public StatsOperation(string operation, Collection<string> data)
    {
        Operation = operation;
        Data = data;
    }
    public string Operation { get; set; }
    public Collection<string> Data{ get; set; }
}

private ObservableCollection<IStatsOperation> dataOperations_ =
        new ObservableCollection<IStatsOperation>();

//...
 Binding items = new Binding();
 PropertyPath path = new PropertyPath("Operation");
 items.Path = path;
 DG_Operations.Columns.Add(new DataGridTextColumn()
 {
     Header = "Operations",
     Width = 133,
     Binding = items
  });
  DG_Operations.Columns.Add(new DataGridComboBoxColumn()
  {
     Header = "Data",
     Width = 190,
     ItemsSource = /*???*/,
     SelectedValueBinding = new Binding("Data"),
     TextBinding = new Binding("Data")
  });
dataOperations_.Add(new StatsOperation(CB_Operation.SelectedItem.ToString(),
                                                           dataCollection));
DG_Operations.DataContext = new DataModelStatsOperations
{
    OperationsStats = dataOperations_
};
//...

任何帮助都将不胜感激!

备注:

好吧,在读了两个第一个答案之后,我注意到了一些事情。我的装订真不对!现在,我想做的是类似于AndyG建议的事情:

代码语言:javascript
运行
复制
DG_Operations.Columns.Add(new DataGridComboBoxColumn()
{
    Header = "Data",
    Width = 190,
    ItemsSource = new Binding("Data"), //notice this here does not work (have a look at the following error)
    SelectedValueBinding = new Binding("Operation"),
    TextBinding = new Binding("Operation")
});

错误:“不能隐式地将'System.Windows.Data.Binding‘类型转换为’System.Collection. implicitly‘”。

如何将ItemsSource绑定到数据?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-02-04 22:12:20

首先,这应该很容易.其次,为什么要在C#中构建(和绑定)列?哇哦。

XAML (我使用常规网格是因为我很懒):

代码语言:javascript
运行
复制
<ListView Name="MyListView">
    <ListView.View>
        <GridView>

            <GridView.Columns>

                <GridViewColumn DisplayMemberBinding="{Binding Operation}" />

                <GridViewColumn>
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding Choices}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

            </GridView.Columns>

        </GridView>
    </ListView.View>
</ListView>

C#

代码语言:javascript
运行
复制
void Window1_Loaded(object sender, RoutedEventArgs e)
{
    var dahList = new List<StatsOperation>();

    dahList.Add(new StatsOperation
    {
        Operation = "Op A",
        Choices = new string[] { "One", "Two", "Three" },
    });

    dahList.Add(new StatsOperation
    {
        Operation = "Op B",
        Choices = new string[] { "4", "5", "6" },
    });

    this.MyListView.ItemsSource = dahList;
}

结果:

动态组合框选择http://www.singingeels.com/Articles/Articles/UserImage.aspx?ImageID=b1e3f880-c278-4d2b-bcc2-8ad390591200的WPF网格

票数 10
EN

Stack Overflow用户

发布于 2009-10-28 01:25:34

我认为错误在于你的装订方式。定义列时,绑定与由特定行表示的对象相关。因此,据我所知,每一行都有一个StatsOperation,因此TextBox列被绑定到操作,这就是您如何拥有它,而ComboBox列ItemsSource应该绑定到一个集合。现在,它看起来像是绑定到一个Collection<Collection<string>>上。

我以前还没有在代码隐藏中定义列,所以这里是XAML中的一个例子。我发现ComboBoxColumn有时很棘手,所以我已经向您展示了如何使用TemplateColumn或ComboBoxColumn在专栏中使用组合框。我从我自己的代码中复制了粘贴,所以在您的示例中,只需将'dg‘替换为'WPFToolkit’:

代码语言:javascript
运行
复制
<dg:DataGrid
      ...
      ...>
      <dg:DataGrid.Columns>
            <dg:DataGridTextColumn Binding="{Binding Operation}" CanUserReorder="True" CanUserResize="True" Header="Operation" />
            <dg:DataGridTemplateColumn CanUserReorder="True" CanUserResize="True" Header="Template Column">
                <dg:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding Data}" SelectedItem="{Binding Operation}" />
                    </DataTemplate>
                </dg:DataGridTemplateColumn.CellTemplate>
            </dg:DataGridTemplateColumn>
            <dg:DataGridComboBoxColumn
                Header="ComboBox Column"                                                                                    
                 SelectedValueBinding="{Binding Operation}"                     
                 SelectedItemBinding="{Binding Operation}">
                <dg:DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="IsSynchronizedWithCurrentItem" Value="False" />
                        <Setter Property="ItemsSource" Value="{Binding Data}" />
                    </Style>
                </dg:DataGridComboBoxColumn.ElementStyle>
                <dg:DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Data}" />
                        <Setter Property="IsDropDownOpen" Value="True" />
                    </Style>
                </dg:DataGridComboBoxColumn.EditingElementStyle>
            </dg:DataGridComboBoxColumn>
      </dg:DataGrid.Columns>

</dg:DataGrid>

我假设操作是所选的项,数据是要从中选择的项,并且您的DataGrid绑定到StatsOperation的集合。祝好运!

票数 6
EN

Stack Overflow用户

发布于 2010-02-04 02:39:52

若要修复ItemsSource绑定错误,请使用以下表单:

代码语言:javascript
运行
复制
BindingOperations.SetBinding(new DataGridComboBoxColumn(), DataGridComboBoxColumn.ItemsSourceProperty, new Binding("Data"));

很明显,您不能在初始化器中这样做,所以您必须稍微移动一下声明,但这应该会解决更新中的错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1633800

复制
相关文章

相似问题

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