【问题标题】:Given Key Not Present in Dictionary Xamarin Forms字典 X​​amarin 表单中不存在给定键
【发布时间】:2017-11-02 15:31:47
【问题描述】:

我正在使用 Xaml 为 UI 进行 Xamarin 表单项目的数据绑定。 到目前为止,它非常简单:

XAML:

<?xml version="1.0" encoding="utf-8" ?>

xmlns:viewModels="clr-namespace:Watson.ViewModels;assembly=Watson"
         x:Class="Watson.Views.DeviceCheck">

<ContentPage.BindingContext>
    <viewModels:DeviceCheckViewModel/>
</ContentPage.BindingContext>

    <!--<ActivityIndicator Color="Red" IsRunning="True"
                   x:Name="loadingScreen"/>-->
<StackLayout>
    <Label Text="Checking Device.."/>

    <Button Text="page nav"
            Command="{Binding NextButton}"></Button>
</StackLayout>

背后的代码:

namespace Watson.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class DeviceCheck:ContentPage
    {

    private DeviceCheckViewModel viewModel;
    public DeviceCheck() {
        InitializeComponent();

        BindingContext = viewModel = new DeviceCheckViewModel(this.Navigation);


    }// end of constructor     

}// end of class

}// end of namespace

这是尝试绑定到视图模型并使用绑定命令在单击按钮时转到另一个页面。 我得到的错误是“字典中不存在给定的键”,这是在尝试构建时。我已将问题隔离到一行:&lt;viewModels:DeviceCheckViewModel/&gt;

我不知道为什么会出现这个错误。

这是视图模型:

namespace Watson.ViewModels
{
    public class DeviceCheckViewModel: INotifyPropertyChanged
    {
        public INavigation Navigation { get; set; }
        public ICommand NextButton { protected set; get; }

    public DeviceCheckViewModel(INavigation navigation)
    {
        this.Navigation = navigation;
        this.NextButton = new Command(async () => await GotoNextPage());

    }

    public async Task GotoNextPage()
    {

        await Navigation.PushAsync(new RegisterDevice());
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this,
                new PropertyChangedEventArgs(propertyName));
    }
}
}

我追求这条路线的原因是坚持 MVVM 架构。 所以将页面导航放在代码后面并不是一个真正的选择。 也请注意,所有模型、视图模型和视图都在同名的文件夹结构中。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# xaml xamarin


    【解决方案1】:

    您在后面的代码中设置绑定上下文:

    BindingContext = viewModel = new DeviceCheckViewModel(this.Navigation);
    

    所以也没有必要使用 xaml 方式。这也创建了一个DeviceCheckViewModel 的实例并将其设置为绑定上下文:

    <ContentPage.BindingContext>
        <viewModels:DeviceCheckViewModel/>
    </ContentPage.BindingContext>
    

    但是,因此它需要有一个无参数的构造函数。这可能是您获得异常的原因。

    【讨论】:

    • 那么您是否建议删除 xaml 绑定上下文?并保留代码?
    • 这实际上修复了它。我刚刚删除了用于绑定上下文的 Xaml 标记,并将代码留在了绑定上下文的版本后面。感谢朋友的帮助。
    • 我通常喜欢有用于绑定的 xaml 标记,所以我可以在 xaml 中使用智能感知。当我必须做一个带参数的 viewModel 并且不希望调用无参数构造函数时,我将放入 xaml 标记,执行我的代码,然后删除它或将其注释掉并将绑定放在代码后面事后。
    【解决方案2】:

    我知道这是一个较旧的线程,但是当遇到同样的问题时,我不满意给定的答案对我来说真的可以接受。我也更喜欢在标记中保留这种类型的绑定;将代码保持在最低限度。

    对我有用的是删除类后面代码上的 XamlCompilation(...) 属性。尝试从您的 DeviceCheck 类中删除此属性。

    我还注意到,类背后的大多数代码都具有此属性,但它仅在其中一些方面存在问题。

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 2022-09-28
      • 1970-01-01
      • 2016-08-14
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多