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;
现在的问题是您需要通知 View
与 MyPickerShouldBeVisible
相关的更改。我通常使用 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();
}
使用上面的示例,将导致您选择器的动态行为。
我需要 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;
现在的问题是您需要通知 View
与 MyPickerShouldBeVisible
相关的更改。我通常使用 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();
}
使用上面的示例,将导致您选择器的动态行为。