我在使用MVVM的UWP中遇到问题,我的cordova compile
Combobox
绑定到我的ViewModel中的项集合,并且我的VM中也是一个项目ItemsSource
绑定的集合。
我需要在视图模型中随意更改项目源和所选项目。问题是,如果SelectedItem
中的SelectedItem
在任何时间点都不存在,则ItemsSource
的绑定似乎会永久中断。
实施例: 假设我有一个绑定到我的VM的Comobox:
SelectedItem
现在在我的ViewModel中,我有:
<ComoboBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" />
初始化后,应用程序将在所选组合框中显示“B”。如果在代码中,例如,我将其更改为“A”,那也将反映视图中的更改。但是,当我调用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";
}
时,组合框将设置为空白,并将忽略我在后面的代码中所做的任何更改。
不幸的是,在我的情况下,在更新源列表之前将ChangeList()
设置为null并不能解决我的问题。
如何更改VM中的源和选定项目?
答案 0 :(得分:0)
当您将Items
更改为新收藏集时,ComboBox
会自动为您重置SelectedItem
。您需要接收此更改并使用NotifyPropertyChanged
进行回复。
尝试将绑定更改为双向:
<ComoboBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
答案 1 :(得分:0)
使用ObservableCollection而不是List
public string SelectedItem {get;组; }
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));
}
}
好的,我不确定您的代码是什么样的,但是如果您要替换ComboBox的ItemsSource,那么您可以这样做:
Items.Clear();
Items = new ObservableCollection {&#34; D&#34;,&#34; E&#34;,&#34; F&#34;};
SelectedItem = Items.FirstOrDefault(c =&gt; c ==&#34; D&#34;);
您必须自己进行错误检查,看看是否&#34; D&#34;通过Items.Any存在于集合中(c =&gt; c ==&#34; D&#34;);这将返回true或false。如果它返回true,则继续并设置您的选择项: SelectedItem = Items.FirstOrDefault(c =&gt; c ==&#34; D&#34;);
现在记住&#34; D&#34;可以是任何字符串。 string searchString =&#34;&#34 ;;
所以现在你可以像这样填写Lambda语句: SelectedItem = Items.FirstOrDefault(c =&gt; c == searchString);
希望有所帮助。