2017-04-04 29 views
8

Nếu tôi có một tài sảnCó thể liên kết với một lĩnh vực ValueTuple trong WPF với C# 7

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

viewmodel và tôi cố gắng liên kết với nó trong XAML/WPF

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

hoặc

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

tôi nhận được lỗi tương tự

enter image description here

Tôi thấy rằng ValueTuple lĩnh vực thực sự lĩnh vực không tính. Đây có phải là vấn đề không?

+1

Vâng, đó là vấn đề. –

+0

Không chắc chắn lý do tại sao nhưng Tuple có các trường thuộc tính và ValueTuple có các trường trường. Đó là một chút khó chịu: ( – bradgonesurfing

+0

Bạn vẫn có thể tạo thuộc tính bao bọc như 'chuỗi công khai Mdf {get {return MachineDefinition.Mdf;}}'. Nó không phải là cách tốt nhất (thậm chí không tốt) nhưng vẫn hoạt động được :) –

Trả lời

6

Sự nhầm lẫn là đối với tuple phong cách cũ (pre C# 7) tất cả các mục đã được tính

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

và do đó bindable. Đối với ValueTuple họ là những lĩnh vực

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

và không bindable.

Nếu bạn google "WPF Tuple Binding" bạn nhận được vô số các kết quả sai vì các kiểu cũ có thể được ràng buộc nhưng những cái mới thì không.

+1

Có vẻ như các bộ giá trị vi phạm một số thực hành tốt: chúng phơi bày các lĩnh vực công cộng VÀ điều đó có nghĩa là các cấu trúc có thể thay đổi được của chúng, mà tôi luôn nghĩ là không chính xác. Có lẽ những cân nhắc về tình trạng lãng phí đã thừa cân điều này. – Evk

0

Cách tiếp cận MdfPath sẽ không bao giờ hoạt động, vì phần tên là rất hạn chế về vị trí thực sự tồn tại. Về cơ bản, nó là tinh khiết biên dịch voodoo, và không tồn tại trong mô hình loại, có nghĩa là bất cứ điều gì mà nói chuyện với các mô hình loại (bao gồm phản ánh, công cụ UI, serializers, vv) chỉ sẽ thấy Item1, Item2 tên ; không phải tên giả.

+0

Bạn sẽ thấy trong câu hỏi của tôi rằng tôi đã thử cả hai. Vấn đề thực sự là ValueTuple sử dụng các trường trong khi Tuple sử dụng các thuộc tính. Cái trước là không thể ngăn cản và cái sau có thể ràng buộc được. – bradgonesurfing

3

Điều bạn có thể thử là triển khai trình chuyển đổi giá trị. Dưới đây là ví dụ ...

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}" /> 

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan