我正在设计一个 MVVM WPF 应用程序,并且有一个 ViewModel,它有一个名为 SelectedCustomer 的属性,类型为 Customer。该对象有一个名为 SummaryDetails 的 ObservableCollection 类型的属性,它逐行呈现到 ListView 中。
为此,我在 ViewModel 上创建了一个名为 CustomerSummaryDetails 的单独属性,它只包含一个 get,它返回包含在我上面提到的客户中的集合。
在 XAML 中,我将 ItemsSource 绑定到 CustomerSummaryDetails 属性。
这样我就不必绑定到不太干净的 SelectedCustomer.SummaryDetails 了。
SelectedCustomer 属性具有 get 和 set 方法,并且 set 为 OTHER 属性 CustomerSummaryDetails 调用 OnPropertyChanged,让 XAML 知道基础集合已更改并进行更新。
问题是,当我更新集合中的一个项目时,它并没有反映在 GUI 上,尽管调用了所有正确的事件。我已经介入并调用了 SelectedCustomer 的 set 方法,然后我按照预期进入 CustomerSummaryDetails 属性的“get”方法的 OnPropertyChanged("CustomerSummaryDetails") 调用。此时我已经深入研究了返回集合的值,列表中的值是更新后的值,但是 GUI 上没有任何反映,所以我很困惑,因为 GUI 似乎正在调用 get 方法来更新它在 OnPropertyChanged() 调用中,但它没有在视觉上反映。
更新 - 包含代码
抱歉没有包含代码,我认为描述起来会更容易,但这里是主要的 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;
}