Uwp Combobox绑定中断源变化

时间:2017-10-06 23:10:40

标签: c# xaml mvvm combobox uwp

我在使用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中的源和选定项目?

2 个答案:

答案 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);

希望有所帮助。