0

ValueAと の 2 つの列を持つテーブルがありますValueB。テーブルをグリッドで表示する必要がありますが、両方ではなくどちらValueAか一方を表示する必要があります。ValueBしたがってValueA、 に値がない場合はValueBが表示され、その逆も同様です。ユーザーが列に値を入力すると、値のみValueAが更新されます。したがってValueB、デフォルト値のようなものです(プログラムの別の部分で更新されます)。

を使用してこの問題を解決しようとしましたが、値を表示MultiBindingすることしかできませんでした。ユーザーがグリッドに入力した値は、常に元の値で上書きされます。

ValueAValueBConverter次のような Convert メソッドを持つという名前のコンバーターを作成しました。

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    if (values[0] != DependencyProperty.UnsetValue && values[0] != null && !string.IsNullOrEmpty(values[0].ToString()))
    {
        Debug.WriteLine("values 0: " + values[0]);
        return values[0].ToString();
    }
    if (values[1] != DependencyProperty.UnsetValue && values[1] != null && !string.IsNullOrEmpty(values[1].ToString()))
    {
        Debug.WriteLine("values 1: " + values[1]);
        return values[1].ToString();
    }

    return null;
}

そして、ConvertBack メソッド (呼び出されることはありません):

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
    return new object [] { value, value };
}

バインドされた列の XAML は次のようになります。

<toolkit:DataGridTextColumn Width="2*" Header="{x:Static localProperties:Resources.TValuesAB}">
    <toolkit:DataGridTextColumn.Binding>
        <MultiBinding Converter="{StaticResource myValueAValueBConverter}" Mode="TwoWay">
            <Binding Path="ValueA" UpdateSourceTrigger="PropertyChanged" />
            <Binding Path="ValueB" UpdateSourceTrigger="PropertyChanged" />
        </MultiBinding>
    </toolkit:DataGridTextColumn.Binding>
</toolkit:DataGridTextColumn>

ViewModel (MVVM パターンを使用しています) でこれを行う必要がありますか、または XAML でこれを行う他の方法はありますか?

4

2 に答える 2

0

ConvertBack メソッドを変更して、値を ValueA に返し、Binding.DoNothing を ValueB に返すだけです。したがって、ユーザーは ValueA のみを変更できます。

 public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return new object[] { value, Binding.DoNothing };
    }
于 2013-05-23T10:19:04.657 に答える