TabItem에 대해 동작을 수행하고 IsSelected 종속성 속성의 변경 내용을 수신 한 다음 탭을 선택하면 명령을 실행할 수 있습니다. 이는 뷰 모델에서 다른 명령을 호출하는 여러 탭으로 확장 될 수 있습니다. 또한 선택적 상황에 대한 명령 매개 변수를 제공 할 수 있습니다 :
class TabSelectedBehavior : Behavior<TabItem>
{
public static readonly DependencyProperty SelectedCommandProperty = DependencyProperty.Register("SelectedCommand", typeof(ICommand), typeof(TabSelectedBehavior));
public ICommand SelectedCommand
{
get { return (ICommand)GetValue(SelectedCommandProperty); }
set { SetValue(SelectedCommandProperty, value); }
}
private EventHandler _selectedHandler;
protected override void OnAttached()
{
DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(TabItem.IsSelectedProperty, typeof(TabItem));
if (dpd != null)
{
_selectedHandler = new EventHandler(AssociatedObject_SelectedChanged);
dpd.AddValueChanged(AssociatedObject, _selectedHandler);
}
base.OnAttached();
}
protected override void OnDetaching()
{
DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(TabItem.IsSelectedProperty, typeof(TabItem));
if (dpd != null && _selectedHandler != null)
{
dpd.RemoveValueChanged(AssociatedObject, _selectedHandler);
}
base.OnDetaching();
}
void AssociatedObject_SelectedChanged(object sender, EventArgs e)
{
if (AssociatedObject.IsSelected)
{
if (SelectedCommand != null)
{
SelectedCommand.Execute(null);
}
}
}
}
XAML
<TabControl>
<TabItem Header="TabItem1">
<i:Interaction.Behaviors>
<local:TabSelectedBehavior SelectedCommand="{Binding TabSelectedCommand}"/>
</i:Interaction.Behaviors>
</TabItem>
<TabItem Header="TabItem2">
</TabItem>
</TabControl>
비슷한 방식으로 당신은 또한 명령에 인 selectionchanged 이벤트를 도는 TabControl에 대한 행동을 할 수있는, 선택한 TabItem의 Tag 객체를 명령 매개 변수로 전달합니다.
나는 그것에 대해서도 걱정할 것이다. 또 다른 경고 플래그는 viewmodel에 탭 인덱스가있는 것은 viewmodel에 뷰 기반 논리가 있음을 의미하며 뷰와 로직의 분리를 파괴합니다. 탭을 변경할 때 무엇을해야합니까? – sondergard
@sondergard 초기 탭을 사용하면 새 데이터가 사용되는 두 번째 탭으로 전환하기 전에 데이터베이스에 생성 및 저장해야하는 많은 개체를 선택할 수 있습니다. –