我有一个带有多个 TabItem 的 ItemsSource 的 TabControl,以及一个将新 TabItem 添加到此列表的附加 TabItem。负责添加项目的 TabItem 监听 MouseUp 事件。 问题是,在添加项目后我更新了 SelectedIndex,但随后 SelectedIndex 更改为我单击的元素。
XAML 的一部分:
<TabControl ItemsSource="{Binding Tabs}" SelectedIndex="{Binding SelectedIndex}">
我的代码:
public ObservableCollection<TabItem> Tabs { get; set; }
public int SelectedIndex { get; set; }
private void Tab_add_MouseUp(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
int count = Tabs.Count;
TabItem tabItem = new TabItemDepartment("Header #x");
Tabs.Insert(count - 1, tabItem);
SelectedIndex = count - 2;
}
编辑:基于答案的最终代码(仅相关部分):
public class CalendarViewModel : INotifyPropertyChanged
{
public ObservableCollection<TabItem> Tabs { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
private int _SelectedIndex;
public int SelectedIndex
{
get
{
return _SelectedIndex;
}
set
{
_SelectedIndex = value;
NotifyPropertyChanged(nameof(SelectedIndex));
}
}
private void Tab_add_MouseDown(object sender, MouseButtonEventArgs e)
{
TabItem tabItem = new TabItemDepartment("Header #x");
Tabs.Insert(Tabs.Count - 1, tabItem);
SelectedIndex = Tabs.Count - 2;
e.Handled = true;
}
protected void NotifyPropertyChanged(string propertyName = null)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
最佳答案
您需要使用 DependencyProperty
, 或 INotifyPropertyChanged
, 因为绑定(bind)引擎不知道 SelectedIndex
的变化属性(property)。
public static readonly DependencyProperty SelectedIndexProperty = DependencyProperty.Register(
"SelectedIndex",
typeof(int),
typeof(WhateverYourClassNameIs));
public int SelectedIndex
{
get { return (int)GetValue(SelectedIndexProperty); }
set { SetValue(SelectedIndexProperty, value); }
}
或者,你可以让这个类实现INotifyPropertyChanged
, 但通常用于已经从 FrameworkElement
派生的类(带 UI 的类),DependencyProperty
将是首选。
关于c# - WPF - 如何停止 TabControl 在 MouseUp 事件中更改索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38369497/