c# - WPF MVVM 可观察集合不更新 GUI

标签 c# wpf mvvm observablecollection

我正在设计一个 MVVM WPF 应用程序,并且有一个 ViewModel,它有一个名为 SelectedCustomer 的 Customer 类型的属性。这个对象有一个名为 SummaryDetails 的 ObservableCollection 类型的属性,它逐行呈现到 ListView 中。

为此,我在 ViewModel 上创建了一个名为 CustomerSummaryDetails 的单独属性,它只包含一个 get,它返回我上面提到的客户中包含的集合。

在 XAML 中,我已将 ItemsSource 绑定(bind)到 CustomerSummaryDetails 属性。

这样我就不必绑定(bind)到不太干净的 SelectedCustomer.SummaryDetails。

SelectedCustomer 属性有一个 get 和一个 set 方法,set 调用 OTHER 属性 CustomerSummaryDetails 的 OnPropertyChanged,让 XAML 知道基础集合已更改并进行更新。

问题是,尽管调用了所有正确的事件,但当我更新集合中的项目时,它并没有反射(reflect)在 GUI 上。我已经介入并调用了 SelectedCustomer 的 set 方法,然后我按照预期进入 CustomerSummaryDetails 属性的“get”方法的 OnPropertyChanged("CustomerSummaryDetails") 调用。此时我已经深入研究了返回集合的值,列表中的值是更新后的值,但是 GUI 上没有任何反射(reflect),所以我很困惑,因为 GUI 似乎正在调用 get 方法来更新它在 OnPropertyChanged() 调用上,但它没有在视觉上反射(reflect)出来。

更新 - 包含代码

很抱歉没有包含代码,我认为只描述会更容易,但这里是主要的 ViewModel 属性

public CustomerSummaryViewModel SelectedCustomer
{
    get { return _selectedCustomer; }
    set
    {
        _selectedCustomer = value;
        OnPropertyChanged("CustomerSummaryDetails");
    }
}

public ObservableCollection<RbcUICustomerSummary> CustomerSummaryDetails
{
    get { return _selectedCustomer.SummaryDetails; }
}

public ItemSummaryViewModel SelectedItem
{
    get { return _selectedItem; }
    set
    {
        _selectedItem = value;
        OnPropertyChanged("SelectedItem");
    }
}

下面的 XAML

    <ListView x:Name="lvCustomerSummary" Margin="10,10,10,10" Background="#F4F8FB" ItemsSource="{Binding CustomerSummaryDetails}" MouseDoubleClick="lvCustomerSummary_MouseDoubleClick" ItemContainerStyle="{StaticResource myHeaderStyleColor}" VirtualizingStackPanel.IsVirtualizing="False" VirtualizingStackPanel.VirtualizationMode="Recycling">
            <ListView.View>
            <GridView ColumnHeaderContainerStyle="{StaticResource myHeaderStyle}">
                    <GridView.Columns>
                    <GridViewColumn Header=""  >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate >
                                <Grid>
                                    <Image Source="{z:ImageStaticResource {Binding IconSelect}}" Width="20" Height="20" />
                                </Grid>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Width="200" Header="SubCustType" DisplayMemberBinding="{Binding SubCustType}" >
                    </GridViewColumn>
                    <GridViewColumn Width="200" Header="SubCustValue"  DisplayMemberBinding="{Binding SubCustValue}">
                    </GridViewColumn>
                    <GridViewColumn Header=""  >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate >
                                <Grid>
                                    <Image Source="{z:ImageStaticResource {Binding IconFlag}}" Width="20" Height="20" />
                                </Grid>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>

最后是执行实际更新的 Updater 方法

private void DisplayCustomerComment(string commentEnt)
{            
    if (_queueViewModel.SelectedCustomer == null) return;
        var selCust = _queueViewModel.SelectedCustomer;

    foreach (var t in selCust.SummaryDetails
        .Where(t => t.SubCustType == AppString.CustomerSummary.Comment))
    {
        t.SubCustValue = commentEnt;
        break;
    }

    _queueViewModel.SelectedCustomer = selCust;
}

最佳答案

您不是在修改 ObservableCollection 本身(例如添加/删除项目),而是在该集合中的项目。 ObservableCollection 负责通知它自己的更改,而不是与其项相关的更改。您应该在 SubCustValue 的 setter 中 NotifyPropertyChange("SubCustValue")。

更改没有反射(reflect)在 UI 中,因为当您 NotifyPropertyChange() 整个集合而不是单个项目的个别属性时,WPF 检测到它实际上是同一个实例(同一个对象引用同一个集合)和以前一样,所以似乎什么都没有改变。

关于c# - WPF MVVM 可观察集合不更新 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13144320/

相关文章:

c# - 组合框 Windows 10 MVVM Light

c# - Entity Framework 模型生成奇怪的错误消息

c# - 错误 - 未标记为可序列化

C# 线程 - 在线程之间发布消息

c# - 如何在 WPF 中从图像源释放图像

wpf - WPF应用程序崩溃(轻松复制)-这是Microsoft BUG吗?

c# - 无法从用法中推断出方法的类型参数

.net - WPF 4.5 父子行为是否改变 : we can now add a child to another parent without exception?

c# - 如何在嵌套的 DataGrid 中绑定(bind) ContextMenu 项?

c# - 将按钮命令绑定(bind)到非静态属性