ItemSource 的 Xamarin 绑定计数

Xamarin binding count of ItemSource

我需要 enable/disable 使用 XAML,一个基于 ItemsSource 中元素数量的选择器。

<Picker 
    ItemsSource="{Binding WoSpesaDett.DsTecnico}" 
    ItemDisplayBinding="{Binding Valore}" 
    SelectedItem="{Binding WoSpesaDett.Tecnico}" 
    IsEnabled="{Binding ???}" 
    Grid.Row="0" Grid.Column="3"/>

我试过 WoSpesaDett.DsTecnico.Count > 0 但没用。

我怎样才能做到这一点?

谢谢!

您可以在绑定上下文中创建一个布尔值:

public bool PickerShouldBeEnabled
{
    get { return WoSpesaDett.DsTecnico.Count > 0; } //returns true if there are more than 0 elements
}

或者为了更好的性能使用 linq "Any()",如果你只是想在列表中有 any 元素时启用它

public bool PickerShouldBeEnabled
{
    get { return WoSpesaDett.DsTecnico.Any(); } //returns true if there are any elements
}

或者您可以创建一个 IValueConverter 以列表为值,并根据列表元素的计数 returns 为真。 对于这种情况,我也可以给你一个基本的转换器。

IValueConverter 整数到 bool:

public class IntToBooleanConverter : IValueConverter
{
    public object Convert (object value, Type targetType, object parameter, CultureInfo culture)
    {
        int minimumLength = System.Convert.ToInt32 (parameter);
        return (int)value >= minimumLength;
    }

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

注:

如果您只需要更改一次选择器的可见性(不是以动态方式),则像其他答案指出的那样创建一个转换器。

否则:

理论上动态隐藏或显示 UI 控件非常简单。您所要做的就是在您的模型中引入一个布尔值 属性,它应该如下所示:

public bool MyPickerShouldBeVisible => WoSpesaDett.DsTecnico.Count > 0;

现在的问题是您需要通知 ViewMyPickerShouldBeVisible 相关的更改。我通常使用 Fody.PropertyChanged 来处理 INotifyPropertyChange 的东西。使用它,您可以使用特殊属性 AlsoNotifyFor(nameof(MyPickerShouldBeVisible)) 标记您的 DsTecnico 属性 以使此解决方案有效。

这是一个完整的例子,ViewModel 数据被简化了:

// INotifyPropertyChanged should be handled by `Fody.PropertyChanged`
public class MyViewModel : INotifyPropertyChanged
{
  public IList<string> MyData { get; set; }
  [AlsoNotifyFor(nameof(MyPickerShouldBeVisible))]
  public bool ShouldShowPicker => MyData.Any();
}

使用上面的示例,将导致您选择器的动态行为。