我在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事件似乎没有正确传播。它可能会以某种方式被吸收。
这种行为的确切解释是什么?