代码之家  ›  专栏  ›  技术社区  ›  Woo-Cash

卡利本。ValueTuple到ComboBox的微绑定可观察集合

  •  2
  • Woo-Cash  · 技术社区  · 7 年前

    我试图使用Caliburn将ValueTuples的ObservableCollection绑定到WPF中的ComboBox。微框架MVVM。在ViewModel中执行此操作时:

    private ObservableCollection<Tuple<string, string>> databasesFromDisk;
    public ObservableCollection<Tuple<string, string>> DatabasesFromDisk
    {
        get => databasesFromDisk;
        set
        {
            databasesFromDisk = value;
            NotifyOfPropertyChange(() => DatabasesFromDisk);
        }
    }
    

    在XAML视图中:

    <ComboBox x:Name="DatabasesFromDisk" DisplayMemberPath="Item1"/>
    

    它起作用了,ComboBox用第一个字符串填充。但是当我尝试使用C#7并更改为:

    private ObservableCollection<(string name, string path)> databasesFromDisk;
    public ObservableCollection<(string name, string path)> DatabasesFromDisk
    {
        get => databasesFromDisk;
        set
        {
            databasesFromDisk = value;
            NotifyOfPropertyChange(() => DatabasesFromDisk);
        }
    }
    

    DisplayMemberPath="name" -相同的空列表。当我移除时,它不能正常工作 DisplayMemberPath -它显示整个列表,但两个字符串串联在一起。 我如何使用ValueTuples?

    1 回复  |  直到 7 年前
        1
  •  0
  •   user2250152    7 年前

    在C#7之前,元组的所有项都是可绑定的属性。在C#7中,ValueTuple是不可绑定的字段。

    https://msdn.microsoft.com/en-us/library/dd386940(v=vs.110).aspx https://github.com/dotnet/corefx/blob/master/src/System.ValueTuple/src/System/ValueTuple/ValueTuple.cs#L291

    IValueConverter

    public class ValueTupleConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var tuple = value as (string name, string path)?;
    
            if (tuple == null)
                return null;
    
            return tuple.Value.Name;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
    
    <ComboBox x:Name="DatabasesFromDisk">
      <ComboBox.ItemTemplate>
        <DataTemplate>
          <TextBlock Text="{Binding Converter={StaticResource ValueTupleConverter}}"/>
        </DataTemplate>
      </ComboBox.ItemTemplate>
    </ComboBox>