Привязка команды TabControl - PullRequest
0 голосов
/ 25 мая 2020

Я использую этот код после кода, взятого из 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!");
 }
}

Я не могу добиться взаимоисключаемости, укажите мне, где я ошибаюсь.

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Вариант 1

вы можете изменить сеттеры так, чтобы они вызывали только 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!");
    }
}
0 голосов
/ 26 мая 2020

Привязки обновятся и при отмене выбора . Вам нужно проверить e.NewValue в вашем обработчике, или почему бы просто не проверить _IsMyTab1Selected et c?

...