将DataTable绑定到DataGrid C#WPF MVVM

将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; }

MVVM新手,在尝试将动态生成的DataTable与DataGrid绑定时,我很难找出哪里出了问题。我已经找到了一些解决方案,并试图根据以前的回答对我的实施进行调整:

XAML:

视图模型

.主讲人:

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
    参数之前使用
    [CallerMemberName]
    属性。这将节省您提供它的时间,因为它会检测调用它的属性(C#5及以上)-例如:
    受保护的void RaisePropertyChangedEvent([CallerMemberName]string propertyName)
  • RaisePropertyChanged
    方法中使用
    PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
    。这样就不用创建变量并检查
    null
    (C#6及以上)
  • dataTable
    属性重命名为
    dataTable
    ——这样可以更好地明确哪些是属性,哪些是字段,这在C语言中很常见#


希望这能有所帮助:)

您提出了错误的
PropertyName
(它似乎是XAML中
网格的名称

调用
RaisePropertyChanged
方法时,提高名称“dataTable”

像这样:

public DataTable dataTable
{
    get { return _dataTable; }
    set
    {
        _dataTable = value;
        RaisePropertyChangedEvent("dataTable");
    }
}

您还可以做以下几件事:

  • propertyName
    参数之前使用
    [CallerMemberName]
    属性。这将节省您提供它的时间,因为它会检测调用它的属性(C#5及以上)-例如:
    受保护的void RaisePropertyChangedEvent([CallerMemberName]string propertyName)
  • RaisePropertyChanged
    方法中使用
    PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
    。这样就不用创建变量并检查
    null
    (C#6及以上)
  • dataTable
    属性重命名为
    dataTable
    ——这样可以更好地明确哪些是属性,哪些是字段,这在C语言中很常见#


希望这有帮助:)

因为您正在将
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");
    }
}