DataGridComboBoxColumn为什么就不能在Binding的时候引用其他Named Element了呢?

下面是代码,摘自一个简单的项目,模拟的是将数据库中的内容放到表格里面,其中有一列,“资源类型”是一个ComboBox,能够让用户进行选择。资源类型绑定在2个对象中,源数据是通过Restypes数组获得,而选中项是通过ResData的FK_RESID来指定:

 

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public List<ClsResType> GameData { get; set; }
        public List<ResData> Restypes { get; set; }

        public void LoadResData()
        {
            Restypes = new List<ResData>();
            Restypes.Add(new ResData() { Resid = "1", Resname = "ResName1" });
            Restypes.Add(new ResData() { Resid = "2", Resname = "ResName2" });
            Restypes.Add(new ResData() { Resid = "3", Resname = "ResName3" });
        }

        public MainWindow()
        {
            GameData = new List<ClsResType>();
            GameData.Add(new ClsResType() { Name = "GameData-1", FK_RESID = "1" });
            GameData.Add(new ClsResType() { Name = "GameData-2", FK_RESID = "2" });
            GameData.Add(new ClsResType() { Name = "GameData-3", FK_RESID = "3" });

            LoadResData();

            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            _TypeCombo.ItemsSource = Restypes;
        }
    }

    public class ClsResType
    {
        public string Name { get; set; }
        public string FK_RESID { get; set; }

    }

    public class ResData
    {
        public string Resid { get; set; }
        public string Resname { get; set; }
    }


 

        <DataGrid Name="dgrData"
                  Height="Auto"
                  Margin="2,2,12,2"
                  HorizontalAlignment="Stretch"
                  VerticalAlignment="Stretch"
                  AutoGenerateColumns="false"
                  Background="White"
                  ItemsSource="{Binding ElementName=ThisWindow,
                                        Path=GameData}">
            <DataGrid.Columns>
                <DataGridTextColumn Width="80"
                                    MinWidth="20"
                                    Binding="{Binding Name}"
                                    Header="资源Name" />
                <DataGridComboBoxColumn x:Name="_TypeCombo"
                                        Width="100"
                                        DisplayMemberPath="Resname"
                                        Header="资源类型"
                                        ItemsSource="{Binding ElementName=ThisWindow,
                                                              Path=Restypes}"
                                        SelectedValueBinding="{Binding FK_RESID}"
                                        SelectedValuePath="Resid" />
            </DataGrid.Columns>
        </DataGrid>


你可以注意到,我在窗口的Load事件中,把_TypeCombo这一列的ItemsSource通过代码绑定到了内部Restypes集合,然后在XAML中,我也设置了其ItemsSource的绑定,你可能会觉得两者重复了,但是!假如把代码去掉,整个程序就不工作了!在Debug的时候会看到会报错:

 

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Restypes; DataItem=null; target element is 'DataGridComboBoxColumn' (HashCode=27237168); target property is 'ItemsSource' (type 'IEnumerable')

 

那么是什么原因导致该绑定失效呢?究其原因,是因为Columns集合只不过是DataGrid的一个属性,不存在于逻辑树和视觉树,所以任何的绑定都是无效的,比如DataContext啊,ElementName啊,Source啊。

具体解决方法可以参考这篇文章:

http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

原文地址:https://www.cnblogs.com/puncha/p/3876987.html