gpt4 book ai didi

c# - WPF MVVM 触发代码基于 Tab SelectedValue,而不是 SelectedIndex

转载 作者:行者123 更新时间:2023-12-03 10:22:59 24 4
gpt4 key购买 nike

在带有 MVVM 的 WPF 中,当用户更改选项卡时,很容易触发一些代码。

<TabControl Margin="0 5 5 5" Background="#66F9F9F9" SelectedIndex="{Binding TabIndex}">

然后在 ViewModel 中:
private int _tabIndex;
public int TabIndex
{
get { return _tabIndex; }
set
{
if(_tabIndex != value)
{
_tabIndex = value;
OnPropertyChanged("TabIndex");

if(value == 1)
{
//do something
}
}
}
}

但我对此隐约感到不舒服。如果另一个开发人员稍后发生并在“1”位置添加另一个选项卡怎么办。如果这是对应用程序至关重要的代码(确实如此),那么事情将会非常糟糕。

当然,单元测试可以将危险降到最低。但这让我想知道:这是否被视为不好的做法?有没有一种方法可以让您使用字符串而不是 int 来引用 Tab?我尝试绑定(bind)到 SelectedValue属性,但更改选项卡时似乎没有发生任何事情。

最佳答案

您可以为 TabItem 设置一个行为,监听 IsSelected 依赖项属性的更改,并在选择选项卡时引发一个命令。这可以扩展到任意数量的选项卡,每个选项卡在 View 模型中调用不同的命令。您还可以为任何可选上下文提供命令参数:

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>

以类似的方式,您还可以为 TabControl 创建一个行为,将 SelectionChanged 事件转换为命令,并将所选 TabItem 的 Tag 对象作为命令参数传递。

关于c# - WPF MVVM 触发代码基于 Tab SelectedValue,而不是 SelectedIndex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25646378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com