C# 在数据网格中显示子属性
Short:如何将DataGridColumn绑定到对象的属性,但显示前一个属性的子属性 Long:我有一门简单的课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 :
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; }
}