13

ResultView に 6 つのタブを持つ TabControl があります。この View の背後にある ViewModel は、ResultTypeOneViewModel または ResultTypeTwoViewModel のいずれかにすることができます。どちらも ResultViewModel から派生しますが、どちらの結果タイプでも結果ビューアーを交換可能に使用できます。

違いは、ResultTypeOneViewModel では、タブ 1 と 3 を表示し、残りを非表示にする必要があることです。ResultTypeTwoViewModel では、タブ 2、3、4、5、6 を表示し、タブ 1 を非表示にする必要があります。

私は次のような方法でこれをやりたかった

<TabItem Name="1" Visibility={Binding IsTabVisible(0)}>
<TabItem Name="2" Visibility={Binding IsTabVisible(1)}>
<TabItem Name="3" Visibility={Binding IsTabVisible(2)}>
etc...

そして、次のように ResultsViewModel で抽象メソッド宣言を行います。

public abstract Visibility IsTabVisible(int index);

そしてResultsOneViewModelには

public override Visibility IsTabVisible(int index)
{
    if (index == 0 || index == 2) return Visibility.Visible;
    return Visibility.Hidden;
}

そしてResultsTwoViewModelには

public override Visibility IsTabVisible(int index)
{
    if (index == 0) return Visibility.Hidden;
    return Visibility.Visible;
}

しかし、バインディングiN WPF XAMLを介してパラメーターを使用してこのようなメソッドを呼び出す方法がわかりません。

これを行う方法を誰かが提案できますか、またはこの方法では不可能な場合は、この問題を解決できる別の方法を教えてください。

4

3 に答える 3

3

この質問に対するより良い提案は、次のように、TabItem のスタイルで style.DataTrigger を使用することです。

<TabItem>
    <TabItem.Style>
        <Style target="{x:Type TabItem}">
            <Style.DataTriggers>
                <DataTrigger Binding="{Binding IsTabVisible}" Value="False">
                    <Setter Property="Visibility" Value = "Collapsed"/>
                </DataTrigger>
            </Style.DataTrigers>
        </Style>
    <TabItem.Style>
</TabItem>
于 2014-07-02T11:02:54.920 に答える
2

インデクサー プロパティを使用して、1 つのパラメーターをプロパティに渡すことができます。インデクサー プロパティからブール値を返すことはおそらくあまり直感的ではありませんが、私にとってはうまく機能します。また、インデクサー プロパティが期待どおりの機能を失うことにも注意してください。

    class MyClass
    {
        public bool this[int tabNumber]
        {
            get
            {
                // Do logic to determine visibility here or in a separate method
                return IsTabVisible(tabNumber);
            }
        }

        bool IsTabVisible(int tabNumber)
        {
            bool result;

            // Method logic...

            return result;
        }
    }

したがって、XAML では、クラス名を使用して、角かっこの間にパラメーターを指定できます。

<TabItem Visibility="{Binding MyClass[0]}}"/>

インデクサー プロパティの NotifyPropertyChanged を発生させる必要がある場合は、次を使用します。

    NotifyPropertyChanged("Item[]");

これが MVVM パターンに適合するかどうかはわかりませんが、単一のパラメーターでメソッドにバインドしたい人にとっては便利です。

于 2020-01-14T10:42:41.183 に答える