在DataGrid RowDetailsTemplate中绑定ComboBox ItemsSource

时间:2011-03-24 12:33:19

标签: c# .net wpf xaml

我正在尝试将ItemsSource绑定到ComboBox中的RowDetailsTemplate。如果我将一个ComboBox放在网格外面,它可以正常工作。我认为这是因为网格上的ItemsSource属性可能会抛弃RowDetailsTemplate中的ComboBox。 XAML低于任何想法?

类别和CatTypes是两个不同的ObservableCollection s。

没有发生错误; ComboBox只显示为空。

<ComboBox ItemsSource="{Binding CatTypes}"></ComboBox>
        <my:DataGrid Name="gridProds" AutoGenerateColumns="False"
        AlternatingRowBackground="Gainsboro" ItemsSource="{Binding Categories}">
            <my:DataGrid.Columns>
                <my:DataGridTextColumn x:Name="CatId" Header="CatID" Width="Auto" Binding="{Binding CategoryID}" />
                <my:DataGridTextColumn Header="CatName" Width="Auto" Binding="{Binding CategoryName}" />
            </my:DataGrid.Columns>
            <my:DataGrid.RowDetailsTemplate>
                <DataTemplate>
                    <Border>
                        <StackPanel>
                            <StackPanel Orientation="Horizontal">
                                <Label>ID:</Label>
                                <TextBox Name="txtGridCatId" Text="{Binding CategoryID}"/>
                            </StackPanel>
                            <StackPanel Orientation="Horizontal">
                                <Label>Category Type:</Label>
                                <ComboBox ItemsSource="{Binding CatTypes}"></ComboBox>
                            </StackPanel>
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </my:DataGrid.RowDetailsTemplate>
        </my:DataGrid>

在被调用的DataSource中有一个类,其中包含以下内容:

private ObservableCollection<string> _cattypes = new ObservableCollection<string> { };

    public ObservableCollection<string> CatTypes
    {
        get
        {

            _cattypes = new ObservableCollection<string> { };

            SqlConnection con = new SqlConnection("MyConnStringHere;");
            SqlCommand cmd = new SqlCommand("Select ID, CatType from PfCategoryType ORDER BY CatType", con);
            con.Open();
            SqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                string CatType = (string)rdr["CatType"];
                _cattypes.Add(CatType);

            }

            con.Close();

            return _cattypes;
        }
    }

在MainWindow.xaml.cs中我有:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        DataSource dataSource = new DataSource();
        this.DataContext = dataSource;
    }
}

2 个答案:

答案 0 :(得分:0)

如果在VS中检查了调试输出,则会看到实际的绑定错误。最有可能在代码之下将为您修复它。

<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=CatTypes}" />

如果你无法让RelativeSource工作,那就使用名字。 CatTypes属性是某个类的属性,您为某个控件创建了一个对象并将其设置为datacontext。只需给该控件命名(例如myControl)并像这样绑定:

<ComboBox ItemsSource="{Binding ElementName=myControl, Path=CatTypes}" />

如果这不起作用,您需要发布更多代码来弄清楚你做错了什么。

答案 1 :(得分:0)

如果你试试这会怎么样?

<ComboBox DataContext="{Binding DataContext, ElementName=myControl}" ItemsSource="{Binding CatTypes}" />

(当然你要重命名“myControl”以匹配你的窗口名称。)

这里,我们将组合框的数据上下文设置为与窗口的数据上下文相同。由于这也是XAML中第一个组合框的相同数据上下文,我想第二个组合框的行为与第一个相似。 (虽然我担心这会导致一些不必要的数据库连接,每个网格行一个。)

第二个想法,如果你需要在行的上下文中设置其他属性,你不会想要设置整个ComboBox的数据上下文。在那种情况下,我会尝试这样的事情。

<ComboBox ItemsSource="{Binding ElementName=myControl, Path=DataContext.CatTypes}" SelectedItem="{Binding CategoryType}" />