问题
If I have a viewmodel property
public (string Mdf, string MdfPath) MachineDefinition { get; set; }
and I try to bind to it in XAML / WPF
<Label Content="{Binding Path=MachineDefinition.Item2}" />
or
<Label Content="{Binding Path=MachineDefinition.MdfPath}" />
I get the same error
I see that ValueTuple fields are really fields not properties. Is this the problem?
回答1:
The confusion is that for old style Tuple ( pre C#7 ) all the Items were properties
https://msdn.microsoft.com/en-us/library/dd386940(v=vs.110).aspx
and thus bindable. For ValueTuple they are fields
https://github.com/dotnet/corefx/blob/master/src/System.ValueTuple/src/System/ValueTuple/ValueTuple.cs#L291
and not bindable.
If you google "WPF Tuple Binding" you get loads of false positives because old style tuples are bindable but the new ones are not.
回答2:
Something you could try is to implement a value converter. Here is an example...
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}" />
Hope this helps.
回答3:
The MdfPath
approach will never work, since the name part is very restrictive in terms of where it actually exists. Essentially, it is pure compiler voodoo, and doesn't exist in the type model, which means that anything that talks to the type model (which includes reflection, UI tools, serializers, etc) will only see the Item1
, Item2
names; not the fake names.
来源:https://stackoverflow.com/questions/43208852/is-it-possible-to-bind-to-a-valuetuple-field-in-wpf-with-c7