2017-10-06 58 views
0

我在使用MVVM的UWP中遇到了问题,其中ComboboxItemsSource绑定到我的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之前,我更新源列表不解决我的问题。

我将如何去改变虚拟机中的源和选定项目?

回答

0

当您将Items更改为新集合时,ComboBox应自动为您重置SelectedItem。您需要收到此更改并以NotifyPropertyChanged回应。

试着改变你的绑定到双向的:

<ComoboBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" /> 
+0

我确实认为它应该可以这样工作。我观察到,当我将绑定模式设置为“TwoWay”时,SelectedItem被设置为“null”,但在此之后绑定似乎仍然被破坏。更改数据模型中的项目不再触发组合框上的get,并且不会选择任何内容。 –

0

用户一个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);

希望有所帮助。

+0

不幸的是,这并没有解决问题。我没有添加/删除源中的项目,我将其替换为新列表。这导致当前'SelectedItem'不再存在于列表中,这就是我想要的绑定 –

+0

好吧,不确定你的代码是什么样子,但是如果你删除了ItemSource,你将不得不寻找item在你的ObservableCollection中。所以,我会做的是做到这一点: – 7VNT