0

これは、 RibbonTab IsSelected not workingの最小化されたエラーの再現です。

デモンストレーション アプリケーションのメイン ウィンドウを次に示します。

ここに画像の説明を入力

アプリケーション メニュー (青い矢印) をクリックすると、メニューがポップアップします。

ここに画像の説明を入力

メインビューをクリックすると、タブ項目がタブパネルに追加されます。

ここに画像の説明を入力

「メインビュー」は、タブのヘッダーとタブ項目の内容の両方であり、奇妙なことではありません。

追加のビューもクリックすると、次のようになります。

ここに画像の説明を入力

タブが表示され、余分なものがリボンに表示されていることがわかります。2 つのタブパネル タブを切り替えると、追加の RibbonTab は「追加ビュー」が選択されている場合にのみ表示されます。

ここで、追加の RibbonTab が表示されるように「追加ビュー」タブを選択し、テキスト ボックスをクリックしてその中に点滅するカーソルを表示し、ctrl+TAB を数回押して要素をタブ オーダーでナビゲートすると、すぐに次のようになります。ヘッダー「extra view」が再度選択されたタブ。追加の RibbonTab は、予想とは異なって見えます。

ここに画像の説明を入力

残っているのは「extra tab」というタブ テキストだけで、テキスト ボックスはもうありません。なぜだめですか?

タブパネル (「メイン ビュー」と「追加ビュー」を表示) のタブをクリックすると、「追加タブ」は「追加ビュー」が選択されている場合にのみ表示されます。これは予期された動作です。ただし、テキスト ボックスとリボンのタブ区切り文字予想外にもうありません。

RibbonTab の可視性は、TabPanel で選択された TabItem のタイプにバインドされ、タブ項目のタイプが ExtraView の場合は Visibility.Visible を返すが、タイプがそれ以外 (MainView など) の場合は返されないコンバーターを使用します。

タブ項目のタイプが ExtraView の場合に true を返すコンバータを使用して、RibbonTab の IsSelected プロパティも選択されたタブ項目にバインドされます。

これは、前述のように、メニュー タブが単なる「追加タブ」以上のものになるプログラムの最小限の例であるため、タブパネル コンテンツのタイプが正しい場合に選択されることが重要です。これは、(可視性に加えて) IsSelected が必要であることを強調するために言います。

どんな助けでも大歓迎です。

MainWindow.xaml:

<RibbonWindow x:Class="TestProblematicRibbons.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:test="clr-namespace:TestProblematicRibbons"
    xmlns:Converters="clr-namespace:TestProblematicRibbons.Converters"
    Height="300" Width="350">
  <RibbonWindow.DataContext>
    <test:MainWindowViewModel/>
  </RibbonWindow.DataContext>
  <RibbonWindow.Resources>
    <Converters:ExtraRibbonTabBooleanConverter x:Key="ExtraRibbonTabBoolean" />
    <Converters:ExtraRibbonTabVisibilityConverter x:Key="ExtraRibbonTabVisibility" />
  </RibbonWindow.Resources>
  <DockPanel>
    <Ribbon DockPanel.Dock="Top">
      <Ribbon.ApplicationMenu>
        <RibbonApplicationMenu>
          <RibbonApplicationMenuItem Header="main view"
            Command="{Binding CreateMainViewCommand}"/>
          <RibbonApplicationMenuItem Header="extra view"
            Command="{Binding CreateExtraViewCommand}"/>
        </RibbonApplicationMenu>
      </Ribbon.ApplicationMenu>

      <RibbonTab Header="extra tab"
          IsSelected="{Binding SelectedTab, Mode=OneWay, Converter={StaticResource ExtraRibbonTabBoolean}}"
          Visibility="{Binding SelectedTab, Mode=OneWay, Converter={StaticResource ExtraRibbonTabVisibility}}">
        <RibbonGroup>
          <RibbonTextBox />
        </RibbonGroup>
      </RibbonTab>
    </Ribbon>
    <TabControl
      ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}" />
  </DockPanel>
</RibbonWindow>

MainWindowModel.cs:

using System.Collections.ObjectModel;
using System.Windows.Controls;
using System.Windows.Input;
using ReactiveUI;

namespace TestProblematicRibbons
{
  public class MainWindowViewModel: ReactiveObject
  {
    private ObservableCollection<TabItem> _tabs
      = new ObservableCollection<TabItem>();

    public ObservableCollection<TabItem> Tabs
    {
      get { return _tabs; }
    }

    private TabItem _SelectedTab;
    public TabItem SelectedTab
    {
      get { return _SelectedTab; }
      set { this.RaiseAndSetIfChanged(x => x.SelectedTab, value); }
    }

    public ICommand CreateMainViewCommand
    { get { return new ActionCommand(CreateMainView); } }

    public ICommand CreateExtraViewCommand
    { get { return new ActionCommand(CreateExtraView); } }

    private void CreateMainView()
    {
      var view = new MainView();
      AddTab(view, "main view");
    }

    private void CreateExtraView()
    {
      var view = new ExtraView();
      AddTab(view, "extra view");
    }

    private void AddTab(UserControl view, string header)
    {
      var tab = new TabItem();
      tab.Header = header;
      tab.Content = view;
      _tabs.Add(tab);

      SelectedTab = tab;
    }
  }
}

ExtraRibbonTabBooleanConverter:

using System;
using System.Globalization;
using System.Windows.Controls;
using System.Windows.Data;

namespace TestProblematicRibbons.Converters
{
  public class ExtraRibbonTabBooleanConverter: IValueConverter
  {
    public object Convert
      (object value, Type targetType, object parameter, CultureInfo culture)
    {
      var item = value as TabItem;

      return item != null && item.Content is ExtraView;
    }

    public object ConvertBack
      (object value, Type targetType, object parameter, CultureInfo culture)
    {
      throw new NotImplementedException();
    }
  }
}

ExtraRibbonTabVisibilityConverter:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace TestProblematicRibbons.Converters
{
  public class ExtraRibbonTabVisibilityConverter: IValueConverter
  {
    public object Convert
      (object value, Type targetType, object parameter, CultureInfo culture)
    {
      var item = value as TabItem;

      return item != null && item.Content is ExtraView
        ? Visibility.Visible
        : Visibility.Collapsed;
    }

    public object ConvertBack
      (object value, Type targetType, object parameter, CultureInfo culture)
    {
      throw new NotImplementedException();
    }
  }
}

MainView と ExtraView は、それぞれ「メイン ビュー」と「追加ビュー」を表示するラベルが付いた UserControl: の 2 つだけなので、ここにそれらのコードを貼り付ける意味はほとんどありません。

4

1 に答える 1

0

場合によっては、バインディングを手動で実装することで問題を解決しました。バインディングの組み合わせは完全に信頼できないようです。彼らは明らかにお互いを邪魔することができます!

于 2013-03-26T07:31:58.067 に答える