将DataTable绑定到DataGrid C#WPF MVVM
MVVM新手,在尝试将动态生成的DataTable与DataGrid绑定时,我很难找出哪里出了问题。我已经找到了一些解决方案,并试图根据以前的回答对我的实施进行调整: XAML: 视图模型 .主讲人:将DataTable绑定到DataGrid C#WPF MVVM,c#,wpf,mvvm,data-binding,wpfdatagrid,C#,Wpf,Mvvm,Data Binding,Wpfdatagrid,MVVM新手,在尝试将动态生成的DataTable与DataGrid绑定时,我很难找出哪里出了问题。我已经找到了一些解决方案,并试图根据以前的回答对我的实施进行调整: XAML: 视图模型 .主讲人: public class Presenter : ObservableObject { private DataTable _dataTable; public DataTable dataTable { get { return _dataTable; }
public class Presenter : ObservableObject {
private DataTable _dataTable;
public DataTable dataTable
{
get { return _dataTable; }
set
{
_dataTable = value;
RaisePropertyChangedEvent("Grid");
}
}
private void ParseData()
{
if (string.IsNullOrWhiteSpace(ID)) return;
dataTable = DataParser.ParseURL(ID);
}
}
.可观察对象
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChangedEvent(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
我知道模型中的数据正在正确返回,当我在调试器中时,RaisePropertyChangedEvent正在启动,但视图没有更新。您提出了错误的
PropertyName
(它似乎是XAML中的网格的名称)
调用RaisePropertyChanged
方法时,提高名称“dataTable”
像这样:
public DataTable dataTable
{
get { return _dataTable; }
set
{
_dataTable = value;
RaisePropertyChangedEvent("dataTable");
}
}
您还可以做以下几件事:
- 在
参数之前使用propertyName
属性。这将节省您提供它的时间,因为它会检测调用它的属性(C#5及以上)-例如:[CallerMemberName]
受保护的void RaisePropertyChangedEvent([CallerMemberName]string propertyName)
- 在
方法中使用RaisePropertyChanged
。这样就不用创建变量并检查PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
(C#6及以上)null
- 将
属性重命名为dataTable
——这样可以更好地明确哪些是属性,哪些是字段,这在C语言中很常见#dataTable
希望这能有所帮助:)您提出了错误的
PropertyName
(它似乎是XAML中网格的名称
调用RaisePropertyChanged
方法时,提高名称“dataTable”
像这样:
public DataTable dataTable
{
get { return _dataTable; }
set
{
_dataTable = value;
RaisePropertyChangedEvent("dataTable");
}
}
您还可以做以下几件事:
- 在
参数之前使用propertyName
属性。这将节省您提供它的时间,因为它会检测调用它的属性(C#5及以上)-例如:[CallerMemberName]
受保护的void RaisePropertyChangedEvent([CallerMemberName]string propertyName)
- 在
方法中使用RaisePropertyChanged
。这样就不用创建变量并检查PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
(C#6及以上)null
- 将
属性重命名为dataTable
——这样可以更好地明确哪些是属性,哪些是字段,这在C语言中很常见#dataTable
希望这有帮助:)因为您正在将
DataGrid的DataContext
设置为DataTable的DataView
,如下所示:
Grid.DataContext = dataTable.DefaultView;
…您应该直接绑定到DataContext
:
<DataGrid x:Name="Grid" Margin="5,0,0,0" ItemsSource="{Binding}" AutoGenerateColumns="False" VerticalAlignment="Center">
...
您仍然需要按照@Geoff James的建议修改您的属性:
public DataTable dataTable
{
get { return _dataTable; }
set
{
_dataTable = value;
RaisePropertyChangedEvent("dataTable");
}
}
由于将DataGrid的DataContext
设置为DataTable的DataView
,如下所示:
Grid.DataContext = dataTable.DefaultView;
…您应该直接绑定到DataContext
:
<DataGrid x:Name="Grid" Margin="5,0,0,0" ItemsSource="{Binding}" AutoGenerateColumns="False" VerticalAlignment="Center">
...
您仍然需要按照@Geoff James的建议修改您的属性:
public DataTable dataTable
{
get { return _dataTable; }
set
{
_dataTable = value;
RaisePropertyChangedEvent("dataTable");
}
}
顶部提示:如果您使用的是C#6或更高版本,则可以使用PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName))
首先将dataTable重命名为dataTable no,而不是创建一个变量并检查null
:)这个问题很烦人。其次,对于属性的名称,请使用“DataTable”而不是“Grid”,或者使用适当的实现进行通知。您还可以使用c#6中的nameof(DataGrid)实现这两种建议;仍然没有让它发挥作用,但是随着我在这里所做的更改,我希望以前的文章能够让我振作起来。顶部提示:如果您使用的是C#6或更高版本,您可以使用PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName))
首先将dataTable重命名为dataTable no,而不是创建一个变量并检查null
:)这个问题很烦人。其次,对于属性的名称,请使用“DataTable”而不是“Grid”,或者使用适当的实现进行通知。您还可以使用c#6中的nameof(DataGrid)实现这两种建议;仍然没有让它发挥作用,但是随着我在这里所做的改变,我希望以前的文章能让我振作起来。谢谢你的回复。我将名称改为“dataTable”,但它仍然不起作用。我还将根据您的反馈进行重构。我担心我在XAML头文件中的绑定不正确,这可能是它没有获取正确信息的原因吗?感谢您的回复。我将名称改为“dataTable”,但它仍然不起作用。我还将根据您的反馈进行重构。我担心我在XAML头文件中的绑定是不正确的,这可能就是为什么它没有引入正确的信息的原因吗?
public DataTable dataTable
{
get { return _dataTable; }
set
{
_dataTable = value;
RaisePropertyChangedEvent("dataTable");
}
}