0

您好我正在尝试在代码内的 DataGrid 中动态绑定 ComboBox。我看到了一些与此相关的答案,但没有一个有帮助。一般的意见是使用 DataTempleteColumn 但这也没有结果。这是我的代码

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
    <Button Name="ButFill" Content="Fill Grid" HorizontalAlignment="Left" Height="22" Margin="373,65,0,0" VerticalAlignment="Top" Width="62"/>
    <DataGrid x:Name="DaGrid" HorizontalAlignment="Left" Height="134" Margin="25,38,0,0" VerticalAlignment="Top" Width="289" ItemsSource="{Binding}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="text" Binding="{Binding Path=col1}"/>
            <DataGridComboBoxColumn Header="combobox" Width="105" ItemsSource="{Binding Path=fill_items}"/>
            <DataGridTemplateColumn Header="template combo" Width="105">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox Name="TempCombo" ItemsSource="{Binding Path=fill_items}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

后面的代码是

Imports System.Collections.ObjectModel

Class MainWindow
    Public Property Table As New ObservableCollection(Of Test.dataset)()
    Public Property fill_items As New ObservableCollection(Of String)
    Private Sub ButFill_Click(sender As Object, e As RoutedEventArgs) Handles ButFill.Click
        Dim temp As New Test.dataset()
        Dim cb As New ComboBox
        fill_items.Add("ItemNo1")
        fill_items.Add("ItemNo2")
        cb.ItemsSource = fill_items
        temp.col1 = " Hello"
        temp.col2 = cb
        temp.col3 = cb
        Table.Add(temp)
        DaGrid.DataContext = Table
    End Sub
End Class


Public Class dataset
    Public Property col1 As String
    Public Property col2 As ComboBox
    Public Property col3 As ComboBox
End Class

我看到的问题是:

1) DataGridComboBox 列在进入编辑模式之前不会显示它。
2)两个组合框都是空的,但集合“表”似乎有一个 combobox.count 2。

我做错什么了吗?有人可以向我展示一个完整的绑定 ComboBox 示例吗?

4

2 回答 2

0

如果您想在窗口的 DataContext 中的组合框中显示 fill_items,那么您需要更新您的组合框列绑定以使用,BindingProxy因为 DataGrid 列不在数据网格的可视树中。

<Window.Resources>
    <local:MyBindingProxy x:Key="myproxy" BindingData="{Binding}" />
</Window.Resources>

DataContext =this;并且您必须像在构造函数中一样将 Mainwindow 的 DataContext 设置为自身

那么您需要为 MyBindingProxy 编写类,例如:

public class MyBindingProxy : Freezable
{
    public static readonly DependencyProperty BindingDataProperty =
        DependencyProperty.Register("BindingData", typeof(object), 
        typeof(MyBindingProxy ), new UIPropertyMetadata(null));

    protected override Freezable CreateInstanceCore()
    {
        return new MyBindingProxy();
    }

    public object BindingData
    {
        get { return (object)GetValue(BindingDataProperty ); }
        set { SetValue(BindingDataProperty , value); }
    }

}

然后您可以将绑定更新为:

<DataGridComboBoxColumn Header="combobox" Width="105" ItemsSource="{Binding BindingData.fill_items, Source={StaticResource myproxy}}"/>
于 2013-09-24T09:03:58.797 回答
0

fill_items必须是您dataset班级中的公共财产,因为绑定在

            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox Name="TempCombo" ItemsSource="{Binding Path=fill_items}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>

请参阅您绑定的集合中的每个项目。在你的情况下,它是一个dataset项目。

您不能简单地使用 RelativeSource 或 ElementName 来查找 DataGrid 并绑定到它,因为DataGridColumns 不会添加到可视化树中,因此这些绑定无法工作。

于 2013-09-24T09:19:12.423 回答