在自定义视图上设置可绑定属性时,ListDictionaryInternal上的空引用异常

塞夫

我刚刚将我的Xamarin Forms项目迁移到了.NET Standard 2.0,并且正在解决一些奇怪的问题。在以下情况下,我在ListDictionaryInternal上收到一个Null引用异常,没有异常断点,没有堆栈跟踪,也没有其他可用信息。从我的视图模型来看,这种情况是在自定义按钮控件上设置可绑定文本属性。我已经调试了整个文本设置过程,之后发生了异常。我完全被这个困扰。而且要明确的是,此代码在.NET Standard 2.0迁移之前已经起作用。先感谢您!

更新:

因此,Forms iOS也开始发生此异常,但是现在当System.Exception断点命中时,我能够获得堆栈跟踪。同样,这与.NET Standard 2.0不相关,因为在针对PCL 4.5项目(准确地说是Profile 111)时也会发生这种情况。

我可以在OnSizeAllocated重写方法后面的代码中设置一个断点,然后查看视图是否接受了绑定文本并正确地进行了布局。因此,问题不是绑定,而是与视图布局有关。

另外,为澄清起见,仅当文本设置为具有可绑定属性时,才会发生此异常。如果在xaml中设置了文本,则不会发生异常。

在此处输入图片说明

ViewModel ...

public class SimpleSearchViewModel : BaseViewModel
{
    enum SearchCatagories
    {
        All,
        SubjectId,
        PublicationNumber
    }

    public override void OnStart()
    {
        UpdateTypeButton("ALL");
    }

    private void UpdateTypeButton(string item)
    {
        SearchTypeButtonText = item;
    }

    private string _searchTypeButtonText;
    public string SearchTypeButtonText
    {
        get
        {
            return _searchTypeButtonText;
        }
        private set
        {
            _searchTypeButtonText = value;
            OnPropertyChanged(nameof(SearchTypeButtonText));
        }
    }
}

风景...

<core:BasePage xmlns="http://xamarin.com/schemas/2014/forms" 
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
xmlns:viewmodels="using:App.ViewModels"
xmlns:customcontrols="clr-namespace:App;assembly=App"
xmlns:core="clr-namespace:App.Core;assembly=App.Core"
x:Class="Pages.SimpleSearchPage"
Title="Simple Search">

<ContentPage.BindingContext>
    <viewmodels:SimpleSearchViewModel />
</ContentPage.BindingContext>

<ContentPage.Content>

<StackLayout Padding=" 10, 10, 10, 10" 
             HorizontalOptions="FillAndExpand" 
             VerticalOptions="FillAndExpand" 
             Orientation="Horizontal" > 

            <customcontrols:SVGImageButton x:Name="TypeSelectionButton" 
                            HorizontalOptions="Start" 
                            VerticalOptions="Center"
                            ButtonPressedCommand="{Binding TypeButtonClickedCommand}"
                               SVGImageName="SVGImages.ic_triangle_down.svg"
                            CommandParameter="{x:Reference TypeSelectionButton}"
                            ButtonText="{Binding SearchTypeButtonText}"
                            ButtonBackgroundColor="{Binding ButtonBackgroundColor}"/>

        </StackLayout>
    </ContentPage.Content>
</core:BasePage>

SVGImageButton ...

[XamlCompilation(XamlCompilationOptions.Compile)]
public class SVGImageButton : ContentView
{
    private readonly Button _button;
    private readonly SvgCachedImage _svgImage;

    public static BindableProperty ButtonTextProperty =    BindableProperty.Create(nameof(ButtonText), typeof(string),   typeof(SVGImageButton), string.Empty, BindingMode.OneWay, propertyChanged: (bindable, oldValue, newValue) =>
    {
        if (newValue == null) return;
        var control = (SVGImageButton)bindable;
        control.ButtonText = newValue.ToString();
    });

    public string ButtonText
    {
        get
        {
            return _button.Text;
        }
        set
        {
            _button.Text = value; 
        }
    }

    public string SVGImageName { get; set; }

    protected override void OnParentSet()
    {
        base.OnParentSet();

        _button.Text = ButtonText;
        _svgImage.Source = SvgImageSource.FromResource(SVGImageName);
     }

    public SVGImageButton()
    {
        var content = new RelativeLayout();

        _button = new Button { BackgroundColor = Color.Gray, TextColor = Color.Black };
        _svgImage = new SvgCachedImage { IsEnabled = false };

        content.Children.Add(_button,
                             Constraint.RelativeToParent((parent) =>
                             {
                                 return parent.X;
                             }),
                             Constraint.RelativeToParent((parent) =>
                             {
                                 return parent.Y;
                             }),
                             Constraint.RelativeToParent((parent) =>
                             {
                                 return parent.Width;
                             }),
                             Constraint.RelativeToParent((parent) =>
                             {
                                 return parent.Height;
                             }));

        content.Children.Add(_svgImage,
                           Constraint.RelativeToParent((parent) =>
                           {
                               return parent.Width - (parent.Height / 2) - (parent.Height / 4);
                           }),
                           Constraint.RelativeToParent((parent) =>
                           {
                               return parent.Height - (parent.Height /     2) - (parent.Height / 4);
                           }),
                           Constraint.RelativeToParent((parent) =>
                           {
                               return parent.Height / 2;
                           }),
                           Constraint.RelativeToParent((parent) =>
                           {
                               return parent.Height / 2;
                           }));

        Content = content;
        }
    }
}
塞夫

因此,这个问题最终源于我在OnMeasure回调中如何处理控件的大小。这里可以看到正确的问题和答案

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在自定义视图双向数据绑定自定义属性

如何以编程方式在视图上设置自定义属性

无法绑定自定义MvvmCross视图

在自定义视图上使用自定义侦听器进行数据绑定

Android数据绑定上的自定义XML属性

引用自定义属性上的属性

Xamarin自定义视图按钮绑定

Xamarin-在XAML中将集合设置为自定义可绑定属性

如何为自定义视图类设置可绘制的属性

在我的自定义视图上读取Android属性

在自定义模型绑定程序中的模型上设置PropertyInfo类型的属性时,执行时间长

如何在DRF JWT视图上设置自定义权限类?

如何在自定义可绑定属性上创建与Intellisense兼容的枚举

当自定义属性值上的值为空时,隐藏特定于前视图的属性

使用GraphClient在365组上设置自定义属性

从ODOO树视图上的“添加自定义过滤器” /“添加自定义组”中删除可选属性

使用自定义视图时发生膨胀异常

拖动视图时设置自定义锚

设置自定义属性

动态添加自定义视图并设置其属性android

自定义属性没有绑定可绑定的属性

具有可绑定属性的自定义视图在Xamarin.Forms SAP上未正确绑定

在各个设备上的自定义图像视图上获取位置

自定义属性上的可绑定装饰器是否可以锁定为 oneWay 或 oneTime?

将自定义类的属性绑定到视图

绑定Angular模板时自定义属性导致错误

自定义渲染未用于可绑定属性更新

使用自定义添加的视图(如 ie 用于空列表)时,Android DiffUtil 不一致异常

无法绑定自定义视图