web-dev-qa-db-ja.com

C#7でWPFのValueTupleフィールドにバインドすることは可能ですか

Viewmodelプロパティがある場合

public (string Mdf, string MdfPath) MachineDefinition { get; set; }

xAML/WPFでそれにバインドしようとしています

<Label Content="{Binding Path=MachineDefinition.Item2}" />

または

<Label  Content="{Binding Path=MachineDefinition.MdfPath}" />

同じエラーが出ます

enter image description here

ValueTupleフィールドは実際にはfieldsではなくpropertiesであることがわかりました。これは問題ですか?

16
bradgonesurfing

混乱は、古いスタイルのタプル(C#7以前)のすべてのアイテムがプロパティだったことです。

https://msdn.Microsoft.com/en-us/library/dd386940(v = vs.110).aspx

したがって、バインド可能です。 ValueTupleの場合、これらはフィールドです

https://github.com/dotnet/corefx/blob/master/src/System.ValueTuple/src/System/ValueTuple/ValueTuple.cs#L291

バインドできません。

グーグル "WPFタプルバインディング"を実行すると、古いスタイルのタプルはバインド可能ですが、新しいタプルはバインドできないため、多くの誤検知が発生します。

27
bradgonesurfing

あなたが試すことができるものは、値コンバーターを実装することです。ここに例があります...

public class TupleDisplayNameConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var Tuple = value as (Int32 Id, String Name)?;

        if (Tuple == null)
            return null;

        return Tuple.Value.Name;
    }

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


<TextBlock Text="{Binding Converter={StaticResource TupleDisplayNameConverter}, Mode=OneWay}" />

お役に立てれば。

6
sergio

名前の部分はveryなので、実際に存在する場所に関して制限があるため、MdfPathアプローチは機能しません。本質的に、それは純粋なコンパイラブードゥーであり、型モデルには存在しません。つまり、型モデル(リフレクション、UIツール、シリアライザなど)と通信するものはすべてonlyを参照Item1Item2名前;偽の名前ではありません。

2
Marc Gravell