Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查datagrid';的元数据已更改_C#_Wpf_Xaml_Datagrid_Metadata - Fatal编程技术网

C# 检查datagrid';的元数据已更改

C# 检查datagrid';的元数据已更改,c#,wpf,xaml,datagrid,metadata,C#,Wpf,Xaml,Datagrid,Metadata,我目前正在使用以下解决方法设置数据网格列的可见性属性: 这在xaml.cs中 但是,我需要检查以确保它尚未更改,否则它将抛出异常。下面是我尝试过的一个例子 if (DataGrid.DataContextProperty.GetMetadata(typeof(DataGrid)) == DataGrid.DataContextProperty.DefaultMetadata) // didn't work 任何帮助都将不胜感激。我认为重写现有类型(一个未由代码声明但属于WPF框架的

我目前正在使用以下解决方法设置数据网格列的可见性属性:

这在xaml.cs中

但是,我需要检查以确保它尚未更改,否则它将抛出异常。下面是我尝试过的一个例子

if (DataGrid.DataContextProperty.GetMetadata(typeof(DataGrid)) == 
    DataGrid.DataContextProperty.DefaultMetadata) // didn't work 

任何帮助都将不胜感激。

我认为重写现有类型(一个未由代码声明但属于WPF框架的类)的属性元数据是非法的

调用
DataContextProperty.OverrideMetadata(typeof(DataGrid),…)
只是偶然的,因为类DataGrid尚未重写
FrameworkElement.DataContext
属性的元数据。但你不能对此做出任何假设,微软可能会决定在未来的WPF版本中改变这一点

您必须在静态类构造函数中创建派生类并重写元数据,如MSDN文档中所示:


你到底在那里干什么?如果需要重写依赖项属性元数据,则应创建一个派生DataGrid,并在派生类的静态构造函数中调用OverrideMetadata。我不确定,很多internet文章都介绍了如何在数据网格列上使用可见性属性,因为它在框架中不存在,而这正是我想到的解决方案,它可以工作,只是不喜欢被调用,如果它已经被改变了。
if (DataGrid.DataContextProperty.GetMetadata(typeof(DataGrid)) == 
    DataGrid.DataContextProperty.DefaultMetadata) // didn't work 
class MyDataGrid : DataGrid
{
    static MyDataGrid()
    {
        DataGrid.DataContextProperty.OverrideMetadata(typeof(MyDataGrid),
            new FrameworkPropertyMetadata(null, 
                FrameworkPropertyMetadataOptions.Inherits,
                new PropertyChangedCallback(OnDataContextChanged)));
    }
}