【发布时间】:2020-12-17 06:16:53
【问题描述】:
在我的项目中,我必须在一个页面上选择多个选项。
每个选项都有一个类型 MyCustomType 并声明了公共字符串 Name 属性。
每个选项都通过标签显示。当我点击标签时,我会显示选项列表并选择它。
选择一个选项后,带有另一个选项的占位符文本(如select an item)的空标签应显示在刚刚选择选项的标签下方。
我为每个选项使用单独的标签,而不是 ListView 元素(客户对特定外观的要求)。
选项的数量是有限的,假设它等于四个。
在我的视图模型中,我声明了列表属性(它已在视图模型构造函数中初始化):
public List<MyCustomType> AllOptions { get; }
在我的 XAML 页面标签中声明为:
<Label Text="{Binding AllOptions[0].Name}" >
<Label Text="{Binding AllOptions[1].Name}" IsVisible="{Binding AllOptions[0], Converter={StaticResource NullToFalseBoolConverter}}">
<Label Text="{Binding AllOptions[2].Name}" IsVisible="{Binding AllOptions[1], Converter={StaticResource NullToFalseBoolConverter}}">
<Label Text="{Binding AllOptions[3].Name}" IsVisible="{Binding AllOptions[2], Converter={StaticResource NullToFalseBoolConverter}}">
转换器NullToFalseBoolConverter 看起来像这样:
public class NullToFalseBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value != null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
问题是在标签声明中指定的 IsVisible 条件不起作用。
显示所有标签。
并且断点,设置为NullToFalseBoolConverter的Convert方法的第一行没有到达。
我不明白为什么会这样。
有什么想法吗?
【问题讨论】:
-
你试过用 ObservableCollection 代替 List 吗?而你的“MyCustomType”实现了 INotifyPropertyChanged?
-
您在调试期间是否在输出窗口中看到任何绑定错误?有时它们很难被注意到。
-
@BradleyUffner 我已将所有文本输出复制到记事本并按
exception和error字词搜索。没有发生错误或异常。 -
@JorgeFernandezHerrero 是的,我也尝试过 ObservableCollection。
MyCustomType是纯数据模型类型。它只保存字符串值,并且这个值在运行时不会改变。在这种情况下,我为什么要为MyCustomType实现 INotifyPropertyChanged? -
@JorgeFernandezHerrero 我找到了解决方案,如果您有兴趣,请查看。
标签: c# xaml xamarin xamarin.forms