gpt4 book ai didi

WPF Datagrid 绑定(bind)在单击行标题之前不会更新

转载 作者:行者123 更新时间:2023-12-03 23:48:21 27 4
gpt4 key购买 nike

我有一个绑定(bind)到 View 模型中的列表的数据网格。在我单击行标题之前,网格的内容不会更新。单击各种单元格不会影响它。我必须点击标题。

这是 XAML 中的数据网格:

<DataGrid x:Name="TransactionDetailsGrid" Grid.Row="1" AutoGenerateColumns="False" SelectionMode="Extended" IsReadOnly="True" HeadersVisibility="Column"
ItemsSource="{Binding TransactionDetailList}" SelectedItem="{Binding SelectedTransactionDetail}" GridLinesVisibility="None">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Account.AccountNumber}" Header="Account No." HeaderStyle="{StaticResource DataGridHeaderStyleCenter}" Width="120" />
<DataGridTextColumn Binding="{Binding Path=Account.AccountName}" Header="Account Name" HeaderStyle="{StaticResource DataGridHeaderStyleCenter}" Width="*" />
<DataGridTextColumn Binding="{Binding Path=Amount}" Header="Amount" HeaderStyle="{StaticResource DataGridHeaderStyleCenter}" Width="120" />
</DataGrid.Columns>
</DataGrid>

这是来自 View 模型:
public List<TransactionDetail> TransactionDetailList
{
get { return this._transactionDetailList; }

set
{
this._transactionDetailList = value;
RaisePropertyChanged("TransactionDetailList");
}
}

这是 View 模型中其中一项的编辑:
private void AddTransactionDetail()
{
TransactionDetailViewModel viewModel = new TransactionDetailViewModel();

MainWindowViewModel.ViewLoader.ShowDialog(viewModel);

if (viewModel.TransactionDetail != null)
{
this.TransactionDetailList.Add(viewModel.TransactionDetail);
RaisePropertyChanged("TransactionDetailList");
}
}

运行后,我可以在 TransactionDetailList 的 getter 上放置一个断点,并且集合中包含该项目。但是,数据网格是空的。如果我单击标题行,该项目将显示在网格中。

我在编辑时遇到了同样的问题。

我之前已经成功地做到了这一点,所以我不确定这里有什么不同。我错过了一些明显的东西吗?为什么在我单击标题行之前网格不会显示其内容?

我刚刚注意到一些有趣的事情。当我单击网格标题时,TransactionDetailList getter 中的断点没有被命中,但数据仍然显示。所以,就像网格有信息一样,它只是在单击标题之前不显示它。

更改为使用 ObservableCollection 后,它起作用了。但是现在我在编辑时遇到了同样的问题(在单击标题之前网格不会更新):
private void EditTransactionDetail()
{
TransactionDetailViewModel viewModel = new TransactionDetailViewModel(this.SelectedTransactionDetail);

MainWindowViewModel.ViewLoader.ShowDialog(new TransactionDetailViewModel(this.SelectedTransactionDetail));

RaisePropertyChanged("TransactionDetailList");
}

我的实体是否需要实现 INotifyPropertyChanged?如果我更改集合并调用 RaisePropertyChanged,这不会导致网格更新吗?

最佳答案

问题是当您从集合中添加或删除项目时,不会调用 setter。这意味着 INotifyPropertyChanged没有被调用,并且 View 无法知道它需要刷新。

WPF 通过支持 INotifyCollectionChanged 解决了这个问题。界面。

尝试使用 ObservableCollection<TransactionDetail>而不是 List<TransactionDetail> . ObservableCollection<T>内置并实现 INotifyCollectionChanged ,因此您不必对代码做太多事情。

还要确保您继续实现 INotifyPropertyChanged在您已经拥有的 View 模型上。这样,当您替换整​​个集合时(调用 setter 时), View 将得到通知。

public ObservableCollection<TransactionDetail> TransactionDetailList
{
get { return this._transactionDetailList; }

set
{
this._transactionDetailList = value;
RaisePropertyChanged("TransactionDetailList");
}
}

看:
  • http://msdn.microsoft.com/en-us/library/ms668604.aspx
  • http://msdn.microsoft.com/en-us/library/ms748365.aspx (虽然这不是使用 MVVM 风格)

  • 编辑 :

    另外,你应该实现 INotifyPropertyChangedTransactionDetail也。如果不能,请将其包装在一个实现了 INotifyPropertyChanged 的类中.

    如果你不在 TransactionDetail 上实现它,而不是您所做的更改不会影响列表,但会影响 TransactionDetail 上的属性例如,在您以某种方式刷新整个列表之前,不会在 UI 中显示。

    如果您尝试通过调用 RaisePropertyChanged 来解决此问题在 list 属性上,您的 UI 认为需要丢弃和更新整个列表(以及整个 UI 对象集)。这会扼杀你的表现并使你的应用程序变得迟缓。

    关于WPF Datagrid 绑定(bind)在单击行标题之前不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6462226/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com