【发布时间】:2023-04-02 14:08:01
【问题描述】:
MVVM 新手,在尝试将动态生成的 DataTable 与 DataGrid 绑定时,我一直在努力找出问题所在。我找到了一些解决方案,并尝试根据之前的回复对我的实现进行调整:
XAML:
<DataGrid x:Name="Grid" Margin="5,0,0,0" ItemsSource="{Binding dataTable, Mode=TwoWay}" AutoGenerateColumns="False" VerticalAlignment="Center">
<DataGrid.Columns>
<DataGridTextColumn Header="Header1" Binding="{Binding Column1Name}"/>
<DataGridTextColumn Header="Header2" Binding="{Binding Column2Name}"/>
</DataGrid.Columns>
<DataGrid.DataContext>
<ViewModels:Presenter/>
</DataGrid.DataContext>
XAML CS:
DataTable dataTable = new DataTable();
Grid.DataContext = dataTable.DefaultView;
//I don't believe I should be using System.Data in View?
视图模型
.演讲者:
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);
}
}
.ObservableObject
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 正在触发,但视图没有被更新。
【问题讨论】:
-
重要提示:如果您使用 C#6 或更高版本,则可以使用
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));而不是创建变量并检查null:) -
首先将数据表重命名为数据表,这个问题只是烦人。第二个属性名称使用“DataTable”而不是“Grid”或使用适当的通知实现。也可以在c#6中使用nameof(DataGrid)
-
实施了这两个建议;仍然没有让它发挥作用,但是我在这里所做的更改,我希望以前的文章可以让我振作起来。
标签: c# wpf mvvm data-binding wpfdatagrid