【发布时间】:2019-10-24 13:28:29
【问题描述】:
我有一个典型的标签,我想通过一个是否为空/空的属性来控制它的可见性。
我已经设置了断点并记录了,看起来返回值是真的,但它仍然没有显示元素。当我滚动我的列表视图时,它们是可见的,但有时仍然不可见.. 有几个项目,有时其中一些可见,有时不可见.. 它是可变的..
这是我的转换器
public class TestBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var result= value != null && !value.ToString().Equals("");
Console.WriteLine("Result: " +result);
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
和属性
public string LocalizedReadoutDescription
{
get
{
Console.WriteLine("Description: " + dataItem.Description);
string localizedDescription = null;
if (!string.IsNullOrEmpty(this.dataItem.Description))
{
string[] descriptionKeyParts = this.dataItem.Description.Split(';');
localizedDescription = descriptionKeyParts[0];
if (!string.IsNullOrEmpty(localizedDescription))
{
localizedDescription =
this.getLocalizedString(Constants.Localization.LogicalItemDescriptionFmt,
localizedDescription);
}
}
return localizedDescription;
}
}
和 Xaml 代码
<ContentView.Resources>
<converters:TestBooleanConverter x:Key="nullToBoolConverter"/>
.....
</ContentView.Resources>
.....
<StackLayout Orientation="Horizontal" Margin="4,2" Grid.Column="1" VerticalOptions="StartAndExpand"
HorizontalOptions="FillAndExpand" Spacing="0" BackgroundColor="White">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Tapped="Help_Tapped" CommandParameter="{Binding}"/>
</StackLayout.GestureRecognizers>
<Label x:Name="HelpLabel" Style="{StaticResource InfoIconLabel}" Text="{x:Static resx:UI.Icon_Info}" Margin="0"
HorizontalOptions="EndAndExpand" VerticalOptions="Start" IsVisible="{Binding LocalizedReadoutDescription,
Converter={StaticResource nullToBoolConverter}}" FontSize="Micro" LineBreakMode="NoWrap"/>
</StackLayout>
我觉得,即使它返回true,但它使用之前的行值。但只有这部分不更新。标签名称,值已更新,但只有某些项目的可见性未更新..
我的错误在哪里?
更新:
我已经为要控制其可见性的标签的属性更改创建了一个事件。我可以看到,IsVisible 始终为真,但在 GUI 上,只有一个项目是可见的.. 但是当我滚动时,有几个是可见的,当我滚动更多时,所有项目都是可见的,因为它必须是
private void HelpLabel_OnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName.Equals("IsVisible"))
{
// I check => ((Xamarin.Forms.Label)sender).IsVisible
//always true
}
}
【问题讨论】:
-
您绑定到
LocalizedReadoutDescription,但您的属性名为LocalizedParamDescription -
@Jason 谢谢你的评论。抱歉,我添加了错误的代码。我刚刚修好了
-
如果这发生在 ListView 的上下文中,则可能是缓存问题。此外,如果您要动态更新值,则需要使用 INotifyPropertyChanged
-
值不会动态变化..缓存似乎更合乎逻辑..我正在使用telerik的列表视图
-
XAML显示后
LocalizedReadoutDescription的值会变吗?也就是说,您是否希望这些东西一开始是可见的,然后隐藏起来?如果是这样,您将如何通知 UILocalizedReadoutDescription的值已更改并且需要更新目标属性?如果您认为某些行正在显示其他行的值,那可能是您的视图模型类中的错误。 Telerik 的代码已投入生产并被广泛使用,因此与您目前编写的代码相比,它的测试和调试可能要好得多。
标签: xaml xamarin.forms data-binding visibility radlistview