6

私の人生では、マルチバインディングを使用してビューモデルにバインドできないようです。ネット上のすべての例は gui 要素に直接バインドされていますが、viewmodel オブジェクトを使用しようとすると例外がスローされます。

私の質問は、xaml で複数のビューモデル オブジェクトにマルチバインディングを追加するにはどうすればよいですか?

ビューモデルで、コンテキスト メニューの IsEnabled プロパティを 2 つの整数にバインドする必要があります。次のバインドは、GUI コンポーネント用に設計されているため、機能しません。int を操作するにはどうすればよいですか?

<MenuItem ItemsSource="{Binding MyMenuItem}">
    <MenuItem.IsEnabled>
        <MultiBinding>
            <Binding ElementName="FirstInt" Path="Value" />
            <Binding ElementName="SecondInt" Path="Value" />
        </MultiBinding>
    </MenuItem.IsEnabled>
</MenuItem>

MyMenuItem は、FirstInt と SecondInt の 2 つの整数を持つ CLR オブジェクトです。

4

4 に答える 4

19

フィリップの答えは受け入れられましたが、フィリップの望ましい解決策を探している人は、次のようにする必要があります。

<MenuItem ItemsSource="{Binding MyMenuItem}">
    <MenuItem.IsEnabled>
        <MultiBinding  Converter="{StaticResource IntsToEnabledConverter}">
            <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Window}" Path="DataContext.FirstInt" />
            <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Window}" Path="DataContext.SecondInt" />
        </MultiBinding>
    </MenuItem.IsEnabled>
</MenuItem>

AncestorTypeそれに応じてバインディングの を変更する必要がある場合があることに注意してください。ビューモデルはDataContextウィンドウの に設定されていると仮定しましたが、同じ考えがユーザーコントロールなどにも当てはまります。

于 2014-06-13T04:47:51.747 に答える
2

特定の例では、2 つの整数をメニュー項目が有効かどうかを表すブール値に変換する IMultiValueConverter が必要です。このようなもの:

Public Class MVCIntsToEnabled
    Implements IMultiValueConverter

    Public Function Convert(ByVal values() As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IMultiValueConverter.Convert
        If values IsNot Nothing Then
            If values.Count = 2 Then
                Return (values(0) > 0) AndAlso (values(1) > 0)
            Else
                Return False
            End If
        Else
            Throw New ArgumentNullException("values")
        End If
    End Function

    Public Function ConvertBack(ByVal value As Object, ByVal targetTypes() As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object() Implements System.Windows.Data.IMultiValueConverter.ConvertBack
        Throw New NotImplementedException()
    End Function

End Class

次のように使用します。

<local:MVCIntsToEnabled x:Key="IntsToEnabledConverter"  />

...

<MenuItem ItemsSource="{Binding MyMenuItem}">
    <MenuItem.IsEnabled>
        <MultiBinding  Converter="{StaticResource IntsToEnabledConverter}">
            <Binding ElementName="FirstInt" Path="Value" />
            <Binding ElementName="SecondInt" Path="Value" />
        </MultiBinding>
    </MenuItem.IsEnabled>
</MenuItem>
于 2009-10-12T14:21:51.347 に答える
2

これは私が知っている古い投稿ですが、同じ問題があり、ネット上で解決策が見つかりませんでした。

彼が求めているのは、ビューモデルの複数のプロパティにバインドする代わりに、GUI 要素にバインドしないマルチバインディングを使用する方法だと思います。

このようなもの:

Xaml:

<MenuItem ItemsSource="{Binding MyMenuItem}">
    <MenuItem.IsEnabled>
        <MultiBinding  Converter="{StaticResource IntsToEnabledConverter}">
            <Binding Source="{Binding FirstInt}" />
            <Binding Source="{Binding SecondInt}" />
        </MultiBinding>
    </MenuItem.IsEnabled>
</MenuItem>

ビューモデル:

public class ViewModel
{
 public int FirstInt{ get { return _firstInt;}}
 public int SecondInt{ get { return _secondInt;}}

}

私もこれを理解することができませんでした。代わりに、SingleValueConverter と、変数 FirstInt と SecondInt の両方を保持する親オブジェクトへのバインディングを使用し、コンバーターでこの親を次のように使用します。

 public class IntsToEnabledConverter :IValueConverter 
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Parent parent = value as Parent;

            if (parent.FirstInt == 1 && parent.SecondInt == 1)
                return true;
            else
                return false;
        }

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

親としてのマルチバインディングがより多くのメンバーを持つより大きなオブジェクトになる可能性があるかのようにきれいではありませんが、私の場合はうまくいきました。マルチバインディング ソリューションを使用できれば、コードの見栄えが良くなります。

于 2010-10-05T04:09:22.763 に答える
1

Bluebit の待機は終わりです...代わりに、ターゲット コントロールのスタイルを作成してください。

これは、コンボボックス(コンボ構成という名前)にまだ選択がない場合(選択されたインデックス-1)、またはViewModelのブール値がに設定されている場合に無効にする必要があるログインボタンであるボタンがある例ですtrue (ログイン処理中)。ViewModel ブール値の場合、そのパスをメンバー名プロパティに設定するだけで、スタイル時に Windows データ コンテキストにバインドされます。

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
    <Style.Triggers>
        <DataTrigger Value="True">
            <DataTrigger.Binding>
                <MultiBinding Converter="{StaticResource MultiComboBoolBoolFalse}">
                    <Binding ElementName="comboConfig" Path="SelectedIndex" />
                    <Binding Path="LoginInProcess"/>
                </MultiBinding>
            </DataTrigger.Binding>
            <Setter Property="IsEnabled" Value="False"/>
        </DataTrigger>
    </Style.Triggers>
</Style>
于 2013-01-15T17:49:48.390 に答える