繁体   English   中英

在DataGrid RowDetailsTemplate中绑定ComboBox ItemsSource

[英]Binding ComboBox ItemsSource in DataGrid RowDetailsTemplate

我试图将ItemsSource绑定到RowDetailsTemplateComboBox 如果将ComboBox放置在网格外部,则可以正常工作。 我认为这是发生的,因为网格上的ItemsSource属性可能会抛出RowDetailsTemplate中的ComboBox。 XAML有什么想法吗?

类别和CatType是两个不同的ObservableCollection

没有错误发生; 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;
    }
}

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

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

如果您无法使RelativeSource工作,请使用名称。 属性CatTypes是某些类的属性,您为该类创建了一个对象并将其设置为某个控件的数据上下文。 只需给该控件命名(例如myControl)并像这样绑定即可:

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

如果这样不起作用,则需要发布更多代码,以弄清楚您在做什么错。

如果您尝试此操作会怎样?

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

(当然,您已重命名“ myControl”以匹配窗口名称。)

在这里,我们将组合框的数据上下文设置为与窗口的数据上下文相同。 由于这也是XAML中第一个组合框的数据上下文,因此我想第二个组合框将像第一个组合框一样开始工作。 (尽管我担心这会导致一些不必要的数据库连接,每个网格行一个。)

再次考虑,如果您需要在该行的上下文中设置其他属性,则不需要设置整个ComboBox的数据上下文。 在这种情况下,我会尝试类似的方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM