WPF-MVVM-C#在ItemsSource更改后无法设置组合框的SelectedItem



我已经为这个问题挣扎了好几天了。我有一个组合框,它获取ItemsSource两次。我第一次尝试查看是否有要显示的数据的脱机备份。显示脱机数据时,软件需要从数据库下载更新后的数据。

如果我在离线备份中没有任何存储的数据,一切都很好。当我备份了一个项目列表时,问题就出现了,我把它放在组合框itemsSource中,然后在几秒钟后更改该列表。

列表实际上显示正确,但selectedItem(这是我从视图模型中得到的东西(被重置了,我无法从代码后面再次设置它。viewModel中的SelectedItem属性实际上设置正确,但它没有到达UI。

该列表是与selectedItem类型相同的ObservableCollection。

我的组合框

<ComboBox ItemsSource="{Binding SomeList, Mode=OneWay}"
SelectedItem="{Binding ListItem, Mode=TwoWay}"
DisplayMemberPath="ItemProperty"
Margin="10,0,0,0" Width="300" VerticalAlignment="Center"/>  

我在离线和在线方法中设置selectedItem的方式:

SomeList= await _mainRepository.BackEndOfflineFirst_GetList();
if (SomeList.Count > 0)
{ 
ListItem = SomeList.SingleOrDefault(list=> list.Property.Equals(SomeVariable.Property));
}

感谢您的帮助。我应该提到添加IsSynchronizedWithCurrentItem=";真"到组合框总是使selectedItem成为列表的第一个项目。

对list.properties的检查等于另一个变量。property ALWAYS返回一个保证在列表中的元素,并且永远不会为null。

忘了提(有点重要,我的错(,但我使用的是Prism,我实现了BindableBase,所以属性定义如下:

private ObservableCollection<Type> _someList ;
public ObservableCollection<Type> SomeList
{
get { return _someList ; }
set { SetProperty(ref _someList , value); }
}

无法从您的解释中推断出问题的原因。代码示例中的一切都是正确的——问题出在其他地方。为了以防万一,我请您澄清:您是否在所有属性中都引发PropertyChanged?

一个提示(包括可能的原因(,对可观察集合使用ReadOnly属性:

public ObservableCollection<...> SomeList {get;}
= new ObservableCollection<...>();
SomeList.Clear();
foreach(var item in await _mainRepository.BackEndOfflineFirst_GetList())
SomeList.Add(item);

找出它不起作用的原因。

只有当值实际更改时,才会引发BindableBase属性更改。

我得到的基本上是同一个对象(不同的对象,相同的值(,所以它实际上并没有引发属性更改。

为了解决这个问题,我放了一个

ListItem = null;
SomeList.Clear();

在finally子句中,然后将我从DB接收到的值实际提供给ListItem。

如果我更改属性太快,它似乎也不起作用(因此出现了finally子句(,所以我不能只放一个

SomeList.Clear();
SomeList = await...

背靠背。

我发现的另一个问题是SomeList.Clear((实际上抛出了一个实际上没有显示的NotSupportedException,因此跳过了一些代码。

这是由于SomeList是一个ObservableCollection引起的。将其更改为通用列表,我现在可以清除它。如果您需要清除ObservableCollection,那么一个简单的Collection=null;同样有效。

感谢所有帮助我的人。

最新更新