Uwp Combobox绑定源代码更改
我在使用MVVM的UWP中遇到了问题,其中Combobox
与ItemsSource
绑定到我的ViewModel中的项目集合,而且在我的VM中也是来自该集合的项目那SelectedItem
是绑定的。Uwp Combobox绑定源代码更改
我需要随意在我的视图模型同时更改项目源和所选择的项目。问题是,如果在任何时间点ItemsSource
中不存在SelectedItem
,则SelectedItem
的绑定似乎永久中断。
例子: 比方说,我有一个绑定到我的虚拟机一个Comobox:
<ComoboBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" />
在我的ViewModel
现在,我有:
public List<string> Items { get; set; } // Pretend these properties call on OnPropertyChanged
public string SelectedItem { get; set; }
public void Initialize() {
Items = new List<string> { "A", "B", "C", "D" };
SelectedItem = "B";
}
public void ChangeList() {
// This breaks the binding that the Combobox has with SelectedItem
Items = new List<string> { "E", "F", "G", "H" };
// This does nothing on the XAML side as the binding is already broken by this poing
SelectedItem = "H";
}
当初始化时,应用程序会显示“ B“在选定的组合框中。如果在代码中说,我将它更改为“A”,这也将反映视图中的更改。但是,当我拨打ChangeList()
时,组合框将被设置为空白,并忽略我在代码后面做出的任何更改。
不幸的是,设置SelectedItem
为null之前,我更新源列表不解决我的问题。
我将如何去改变虚拟机中的源和选定项目?
当您将Items
更改为新集合时,ComboBox
应自动为您重置SelectedItem
。您需要收到此更改并以NotifyPropertyChanged
回应。
试着改变你的绑定到双向的:
<ComoboBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
用户一个ObservableCollection,而不是一个列表
公共字符串的SelectedItem {获得;组; }
private ObservableCollection<string> _Items = new ObservableCollection<string> { "A","B", "C"};
public ObservableCollection<string> Items
{
get
{
return _Items;
}
set
{
if (value == _Items)
{ return; }
_Items = value;
RaisePropertyChanged(nameof(Items));
}
}
好吧,我不知道你的代码是什么样子,但如果您要更换你的组合框的ItemsSource时,那么你可以这样做:
Items.Clear();
物品=新的ObservableCollection { “d”, “E”, “F”};
的SelectedItem = Items.FirstOrDefault(C => C^== “d”);
你必须做你自己的错误检查,看看是否“d”集合中存在通过做Items.Any(C =>ç==“d”);这将返回true或false。如果它返回true,那么继续并设置您选择的项目: SelectedItem = Items.FirstOrDefault(c => c ==“D”);
现在请记住“D”可以是任何字符串。 string searchString =“”;
所以现在你可以填写拉姆达声明是这样的: 的SelectedItem =项目。FirstOrDefault(c => c == searchString);
希望有所帮助。
不幸的是,这并没有解决问题。我没有添加/删除源中的项目,我将其替换为新列表。这导致当前'SelectedItem'不再存在于列表中,这就是我想要的绑定 –
好吧,不确定你的代码是什么样子,但是如果你删除了ItemSource,你将不得不寻找item在你的ObservableCollection中。所以,我会做的是做到这一点: – 7VNT
我确实认为它应该可以这样工作。我观察到,当我将绑定模式设置为“TwoWay”时,SelectedItem被设置为“null”,但在此之后绑定似乎仍然被破坏。更改数据模型中的项目不再触发组合框上的get,并且不会选择任何内容。 –