【问题标题】:Xamarin Forms View only renders when Added as a child in the codebehindXamarin Forms View 仅在作为代码隐藏中的子项添加时呈现
【发布时间】:2018-04-30 05:26:48
【问题描述】:

我有一个自定义视图,我试图将其作为List<T> 传递给。出于某种原因,在尝试加载页面时,应用会抛出 System.ArrayTypeMismatchException

这是课程:

public class DiaryCalendarCustomView : View
{
    MiscFunctions misctools = new MiscFunctions();

    private List<DiaryNextContactEventModel> _eventList = new List<DiaryNextContactEventModel>();

    public List<DiaryNextContactEventModel> EventList
    {
        get { return _eventList; }
        set { _eventList = value; }
    }

    public void SetSelectedDate (DateTime selectedDate)
    {
        SelectedDate = selectedDate;

        Settings.Current.NextContactContactDate = selectedDate.ToLocalTime();
    }

    public DateTime SelectedDate { get; set; }

    public DiaryCalendarCustomView()
    {
    }
}

查看模型:

private List<DiaryNextContactEventModel> _eventList = new List<DiaryNextContactEventModel>();

public List<DiaryNextContactEventModel> EventList
{
    get { return _eventList; }
    set { SetProperty(ref _eventList, value); }
}

当我将静态数据添加到 EventList 对象时,它可以正常工作,当我从 XAML 视图中删除绑定时,它也可以正常工作。所以问题似乎是 xamarin 试图将我的列表转换为另一种类型的可枚举,这就是它失败的地方。

XAML:

<Grid VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
       <Grid.Children>
            <partials:DiaryCalendarCustomView EventList="{Binding EventList}"/>
       </Grid.Children>
 </Grid>

调试和搜索并没有真正提供任何有用的东西。任何帮助将不胜感激。

【问题讨论】:

    标签: mvvm xamarin.forms prism


    【解决方案1】:

    如果你想在 XAML 中使用自定义属性,你需要在你的视图中声明它。您的代码看起来不错,只需按照以下教程进行操作:Creating Custom Controls with Bindable Properties in Xamarin.Forms 并添加缺少的部分,因此属性定义和 propertyChanged 方法:

    public static readonly BindableProperty EventListProperty = BindableProperty.Create(
                                                             propertyName: "EventList",
                                                             returnType: typeof(List<DiaryNextContactEventModel>),
                                                             declaringType: typeof(DiaryCalendarCustomView),
                                                             defaultValue: "",
                                                             defaultBindingMode: BindingMode.TwoWay,
                                                             propertyChanged: EventListPropertyChanged);
    

    还有:

    private static void EventListPropertyChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var view = (DiaryCalendarCustomView) bindable;
        view.EventList = (List<DiaryNextContactEventModel>) newValue;
    }
    

    还要确保你的类实现了 INotifyPropertyChanged 接口,所以当你在 EventListPropertyChanged 中改变 EventList 时,视图会被重新加载

    【讨论】:

    • 您好,谢谢您的回答,正如您在上面提到的,我已经添加了一个 BindableProperty,并且我已经阅读了该教程,看看我是否遗漏了什么,但我仍然遇到同样的错误。
    • 奇怪,EventListPropertyChanged方法被调用了吗?
    • 页面无法加载,在InitializeComponent()崩溃
    • 为了更正我之前的声明,在我将代码从后面的代码移动到自定义视图类并稍微弄乱了一点(还必须修复一些空问题)之后,页面现在加载了。我现在唯一的问题是,一旦我的请求返回,我似乎无法使用绑定数据对其进行更新。
    • 并跟进这一点。发现这是因为日历没有重绘。更改了更多代码,我们很高兴。非常感谢您为我指明了这个方向。祝你好运!
    猜你喜欢
    • 2021-03-08
    • 2021-03-19
    • 1970-01-01
    • 2019-11-06
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多