WPF TabControl - 在ItemsSource-CollectionChanged事件

时间:2015-08-28 17:35:48

标签: c# wpf

我在WPF TabControl中遇到了一些奇怪的行为。使用其他基于Selector的类,如ComboBox,我无法重现它。

当我有一个TabControl绑定到ItemsSource并向其添加一个项目,以便触发CollectionChanged事件时,我尝试更改事件处理程序中的SelectedItem属性。不幸的是,UI并没有自我更新。内容更改但未选中标头。

我的XAML:

<TabControl ItemsSource="{Binding Path=ints}" 
            SelectedItem="{Binding Path=SelectedInt}"/>

我的代码:

  public class ViewModel
    {
            private int selectedInt;

            public ObservableCollection<int> Ints { get; set; }

            public int SelectedInt
            {
                get { return this.selectedInt; }
                set
                {
                    this.selectedInt = value;
                    this.NotifyOfPropertyChange();
                }
            }

            public ViewModel(){
                 this.ints.CollectionChanged += (sender, args) => this.SelectedInt = this.ints.First();
                 // We have to call the Add-method asynchronously before adding an item to ensure the TabControl is loaded.
                 Application.Current.Dispatcher.BeginInvoke(new Action(() => this.ints.Add(2);}));
             }
    }

当我没有CollectionChanged事件的事件处理程序时,但是我在添加项目后直接设置了SelectedItem属性,那么一切正常:

this.ints.Add(2);
this.SelectedInt = this.ints.First();

同样异步更改SelectedItem属性会导致UI正确更新:

this.ints.CollectionChanged += (sender, args) => Application.Current.Dispatcher.BeginInvoke(new Action(() => this.SelectedInt = this.ints.First()));

在CollectionChanged事件期间调用SelectedItem属性的PropertyChanged事件似乎没有正确传播。它可能会以某种方式被吸收。

这种行为的确切解释是什么?

0 个答案:

没有答案