Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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# 在数据网格中显示子属性_C#_Wpf_Binding_Datagrid - Fatal编程技术网

C# 在数据网格中显示子属性

C# 在数据网格中显示子属性,c#,wpf,binding,datagrid,C#,Wpf,Binding,Datagrid,Short:如何将DataGridColumn绑定到对象的属性,但显示前一个属性的子属性 Long:我有一门简单的课 public class Measurement { public double xPosition { get; set; } public double yPosition { get; set; } public double MeasuredValue { get; set; } } 这被另一个类使用: public class Sample :

Short:如何将DataGridColumn绑定到对象的属性,但显示前一个属性的子属性

Long:我有一门简单的课

public class Measurement
{
    public double xPosition { get; set; }
    public double yPosition { get; set; }
    public double MeasuredValue { get; set; }
}
这被另一个类使用:

public class Sample : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    private string name;
    public string Name
    {
        get { return name; }
        set 
        {
            name = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Name"));
        }
    }

    private Measurement experimentResult;
    public Measurement ExperimentResult
    {
        get
        {
            return experimentResult;
        }
        set
        {
            experimentResult = value;
            PropertyChanged(this, new PropertyChangedEventArgs("ExperimentResult"));
        }
}
我想在数据网格中显示
示例的列表。一列是
名称
,另一列应该显示
实验结果的
测量值
。但是我不能绑定到
实验结果。MeasuredValue
,因为 不引发
属性更改
事件


因此,问题是:如何显示示例的
MeasuredValue

没有任何东西可以阻止您绑定到一个属性,该属性在其setter中不会引发PropertyChanged事件,但是当该属性发生时,您的UI不会更新。至于绑定到子属性,可以通过关闭DataGrid中的自动列生成,然后显式定义所需的列来实现。在此过程中,您可以在绑定语句中引用子属性:

    <DataGrid ItemsSource="{Binding Samples}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Name}"/>
            <DataGridTextColumn Binding="{Binding ExperimentResult.MeasuredValue}"/>
        </DataGrid.Columns>
    </DataGrid>

作为参考,这是我的代码隐藏: 公共部分类主窗口:窗口 { 公共主窗口() { 初始化组件(); this.DataContext=newviewmodel();
} }

公共类视图模型
{
私有ObservableCollection_样本=新ObservableCollection()
{
新样本()
{
Name=“Sample1”,
实验结果=新测量()
{MeasuredValue=100.00,xPosition=1,yPosition=0}
},
新样本()
{
Name=“Sample2”,
实验结果=新测量()
{
测量值=50.00,X位置=2,Y位置=3}
}
};
公众可观测采集样本
{
得到
{
退回样品;
}
}
}
公共类示例:INotifyPropertyChanged
{
公共事件PropertyChangedEventHandler PropertyChanged=委托{};
私有字符串名称;
公共字符串名
{
获取{返回名称;}
设置
{
名称=值;
PropertyChanged(即新PropertyChangedEventArgs(“名称”);
}
}
私人测量结果;
公众测量结果
{
得到
{
返回实验结果;
}
设置
{
实验结果=数值;
PropertyChanged(这是新PropertyChangedEventArgs(“实验结果”);
}
}
}
公共类度量
{
公共双xPosition{get;set;}
公共双Y位置{get;set;}
公共双测量值{get;set;}
}
public class ViewModel
{
    private ObservableCollection<Sample> _samples = new ObservableCollection<Sample>()
    {
        new Sample()
        {
            Name = "Sample1",
            ExperimentResult = new Measurement()
            { MeasuredValue = 100.00, xPosition = 1, yPosition = 0}
        },
        new Sample()
        {
            Name = "Sample2",
            ExperimentResult = new Measurement()
            {
                MeasuredValue = 50.00, xPosition = 2, yPosition = 3}
        }
    };

    public ObservableCollection<Sample> Samples
    {
        get
        {
            return _samples;
        }
    }
}

public class Sample : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    private string name;
    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Name"));
        }
    }

    private Measurement experimentResult;
    public Measurement ExperimentResult
    {
        get
        {
            return experimentResult;
        }
        set
        {
            experimentResult = value;
            PropertyChanged(this, new PropertyChangedEventArgs("ExperimentResult"));
        }
    }
}

public class Measurement
{
    public double xPosition { get; set; }
    public double yPosition { get; set; }
    public double MeasuredValue { get; set; }
}