如何解决当 ItemsSource 更改 MVVM 时,组合框 SelectedItem 不会更新
我在主视图模型中定义了一个 Aperture 的 OvserableCollection
主视图模型
public ObservableCollection<LookupItemViewModel> Apertures { get; }
public void LoadAperturesCollection()
{
Apertures.Clear();
var items = _apertureTableListService.GetAllApertures();
Apertures.Add(new LookupItemViewModel(0,null,true));
foreach (var item in items)
{
Apertures.Add(new LookupItemViewModel(item.Id,item.DisplayName,item.Active));
}
SessionViewModel.LoadActiveCollection(Apertures,nameof(Apertures));
}
我在编辑视图模型中有一个 ActiveApertures 的 ObservableCollection - 这是来自 Apertures 的集合,该集合的字段 Active 设置为 true
编辑视图模型
public ObservableCollection<LookupItemViewModel> ActiveApertures { get; }
private void LoadActiveAperturesCollection(ObservableCollection<LookupItemViewModel> collection)
{
ActiveApertures.Clear();
foreach (var item in collection)
{
if (item.Active)
{
ActiveApertures.Add(new LookupItemViewModel(item.Id,item.Active));
}
}
}
Exposure 表有一个 Aperture 属性,它是 Aperture 表的外键
在曝光编辑视图中是一个带有 ActiveApertures ItemsSource 的组合框
曝光编辑视图
<ComboBox
x:Name="comboBoxExposureDataAperture"
Grid.Column="3"
Grid.Row="5"
DisplayMemberPath="DisplayName"
IsSynchronizedWithCurrentItem="True"
IsTextSearchEnabled="True"
IsTextSearchCaseSensitive="True"
ItemsSource="{Binding ActiveApertures}"
SelectedValue="{Binding Exposure.ApertureId,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="Id"
Style="{DynamicResource ComboboxData}"
VerticalAlignment="Bottom"
Width="110"
Margin="0,5"/>
如果我编辑一个 Aperture,Apertures 集合会更新,ActiveApertures 集合也会更新,但组合框中的 SelectedItem 现在为空。所有的视图模型都实现了 INotifyPropertyChanged()。
我一直在互联网上搜索,但我还没有找到与此问题匹配的解决方案。 任何建议将不胜感激。
编辑 1
private LookupItemViewModel selectedRecord;
public LookupItemViewModel SelectedRecord
{
get { return selectedRecord; }
set
{
if(value != selectedRecord)
{
selectedRecord = value;
OnPropertyChanged();
}
}
}
<ComboBox
x:Name="comboBoxExposureDataAperture"
Grid.Column="3"
Grid.Row="5"
DisplayMemberPath="DisplayName"
IsSynchronizedWithCurrentItem="True"
IsTextSearchEnabled="True"
IsTextSearchCaseSensitive="True"
ItemsSource="{Binding ActiveApertures}"
SelectedItem="{Binding SelectedRecord}"
SelectedValue="{Binding Exposure.ApertureId,5"/>
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propertyName));
}
编辑2
public void LoadAperturesCollection()
{
Apertures.Clear();
var items = _apertureTableListService.GetAllApertures();
Apertures.Add(new LookupItemViewModel(0,nameof(Apertures));
}
private void LoadActiveAperturesCollection(ObservableCollection<LookupItemViewModel> collection)
{
ActiveApertures.Clear();
foreach (var item in collection)
{
if (item.Active)
{
ActiveApertures.Add(new LookupItemViewModel(item.Id,item.Active));
}
}
}
解决方法
那么为什么不在 SelectItem
中绑定 Combobox
?
如果您已在 viewModel 中实现了 INotifyPropertyChanged
,请创建一个名为 SelectedRecord 的 ActiveApertures 项示例并将其绑定到 ComboBox
。如下图修改
EditViewModel
更改为:
public class EditViewModel : INotifyPropertyChanged
{
public ObservableCollection<LookupItemViewModel> ActiveApertures { get; }
private LookupItemViewModel _selectedRecord;
public LookupItemViewModel SelectedRecord
{
get
{
return _selectedRecord;
}
set
{
if(value != _selectedRecord)
{
_selectedRecord = value;
OnPropertyChanged("SelectedRecord");
}
}
}
/.............................................................
/.............................................................
/.............................................................
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propertyName));
}
}
将 ComboBox
更改为:
<ComboBox
x:Name="comboBoxExposureDataAperture"
Grid.Column="3"
Grid.Row="5"
DisplayMemberPath="DisplayName"
IsSynchronizedWithCurrentItem="True"
IsTextSearchEnabled="True"
IsTextSearchCaseSensitive="True"
ItemsSource="{Binding ActiveApertures}"
SelectedValue="{Binding Exposure.ApertureId,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="Id"
SelectedItem="{Binding SelectedRecord}"
Style="{DynamicResource ComboboxData}"
VerticalAlignment="Bottom"
Width="110"
Margin="0,5"/>
,
我找到了一种使用 AfterDataSaved 事件更新 SelectedItem 的方法。
感谢所有尝试提供帮助的人。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。