【问题标题】:TabControl Command bindingTabControl 命令绑定
【发布时间】:2020-05-25 17:46:35
【问题描述】:

我正在使用从 Stackoverflow 获取的代码。

我想在SelectionChanged 事件中将字符串从一个视图模型传输到另一个视图模型。但是当我点击 Tab2 时,我得到 Tab2 消息框,但是当我点击 Tab1 时,我得到两个消息框,表明两者都在执行。当我点击 Tab1 时也是一样,两个消息框都可以看到。

MainView.xaml

<TabControl>
 <TabItem Header="My tab 1" Selector.IsSelected="{Binding IsMyTab1Selected}"> ... </TabItem>
 <TabItem Header="My tab 2" Selector.IsSelected="{Binding IsMyTab2Selected}"> ... </TabItem>
</TabControl>

MainViewModel.cs

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName) {
 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

public MainViewModel() {
 PropertyChanged += handlePropertyChanged;
}

public bool IsMyTab1Selected {
 get { return _IsMyTab1Selected ; }
 set {
  if (value != _IsMyTab1Selected ) {
   _IsMyTab1Selected = value;
   OnPropertyChanged("IsMyTab1Selected ");
  }
 }
}
private bool _IsMyTab1Selected = false;

public bool IsMyTab2Selected {
 get { return _IsMyTab2Selected ; }
 set {
  if (value != _IsMyTab2Selected ) {
   _IsMyTab2Selected = value;
   OnPropertyChanged("IsMyTab2Selected ");
  }
 }
}
private bool _IsMyTab2Selected = false;

private void handlePropertyChanged(object sender, PropertyChangedEventArgs e) {
 if (e.PropertyName == "IsMyTab1Selected") {
   MessageBox.Show("Tab_1 Clicked!");
 } else if (e.PropertyName == "IsMyTab2Selected") {
   MessageBox.Show("Tab_2 Clicked!");
 }
}

我无法获得互斥性,指出我哪里错了。

【问题讨论】:

  • 你不能指望人们通过多页长链接。在您的问题中添加一个最小的代码示例。否则很难帮助你。为什么会有注释掉的代码?
  • @Blechdose 知道了,所以我发布了来自:stackoverflow.com/a/46074186 的代码
  • @highlander141:当第一个选项卡的IsSelected 属性设置为true 时,第二个选项卡设置为false,反之亦然。这是预期的行为,不是吗?或者你的问题是什么?
  • 是的,即使我也这么认为。但是两个消息框都在执行。正如 Gaz 在他的回答中所说,'e.NewValue' 也必须被检查..

标签: c# wpf mvvm tabcontrol tabitem


【解决方案1】:

选项 1

您可以将设置器更改为仅在值为 true 时调用 OnPropertyChanged(..)

public bool IsMyTab1Selected
{
    get { return _IsMyTab1Selected; }
    set
    {
        if (value != _IsMyTab1Selected)
        {
            _IsMyTab1Selected = value;
            if (_IsMyTab1Selected)
                OnPropertyChanged("IsMyTab1Selected");
        }
    }
}

public bool IsMyTab2Selected
{
    get { return _IsMyTab2Selected; }
    set
    {
        if (value != _IsMyTab2Selected)
        {
            _IsMyTab2Selected = value;
            if(_IsMyTab2Selected)
                OnPropertyChanged("IsMyTab2Selected");
        }
    }
}

选项 2

或者你可以检查你的handlePropertyChange()如果值是这样的

private void handlePropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "IsMyTab1Selected")
    {
        if(IsMyTab1Selected)
            MessageBox.Show("Tab_1 Clicked!");
    }
    else if (e.PropertyName == "IsMyTab2Selected")
    {
        if(IsMyTab2Selected)
            MessageBox.Show("Tab_2 Clicked!");
    }
}

【讨论】:

    【解决方案2】:

    绑定也会在取消选择时更新。您需要在处理程序中检查e.NewValue,或者为什么不简单地检查_IsMyTab1Selected 等?

    【讨论】:

    • 我想使用 RelayCommand 从这个 ViewModel 与另一个进行通信,所以我无法签入 xaml.cs 代码..
    猜你喜欢
    • 1970-01-01
    • 2018-04-21
    • 2012-08-23
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2010-12-23
    相关资源
    最近更新 更多