Xamarin: 属性绑定未找到

4
这个应用在UWP中运作良好。我已经除去了所有不必要的内容,只剩下一个在Android上出现问题的基础属性。代码如下:

MyPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:ViewModels="clr-namespace:MyApp.ViewModels"
             x:Class="MyApp.Views.MyApp">
    <ContentPage.BindingContext>
        <ViewModels:MyViewModel />
    </ContentPage.BindingContext>
    <ContentPage.Content>
        <ScrollView>

            <StackLayout Style="{StaticResource PageForm}">

                <Picker ItemsSource="{Binding Modes}"
                    ItemDisplayBinding="{Binding Value}"
                    SelectedItem="{Binding SelectedMode}" />

            </StackLayout>

        </ScrollView>

   </ContentPage.Content>
</ContentPage>

MyPage.cs

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace MyApp.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class MyApp : ContentPage
    {
        public MyApp ()
        {
            InitializeComponent ();
        }
    }
}

MyViewModel.cs

using MyApp.Models;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
namespace MyApp.ViewModels
{
    public class MyViewModel: INotifyPropertyChanged
    {
        List<Mode> _modes;
        Mode _selectedMode;

        public event PropertyChangedEventHandler PropertyChanged;

        public MyViewModel()
        {
            Modes = new List<Mode>()
            {
                new Mode() { Key=ModeType.Mode1, Value="Mode1" },
                new Mode() { Key=ModeType.Mode2, Value="Mode2" }
            };
            SelectedMode = Modes.Single(m => m.Key == ModeType.Mode1);
        }

        public List<Mode> Modes {
            get { return _modes; }
            set {
                _modes = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Modes"));
            }
        }

        public Mode SelectedMode {
            get {
                return _selectedMode;
            }
            set {
                _selectedMode = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedMode"));
            }
        }

    }
}

Mode.cs

namespace MyApp.Models
{
    public enum ModeType { Mode1, Mode2 };
    public class Mode
    {
        public ModeType _key;
        public string _value;
        public ModeType Key {
            get
            {
                return _key;
            }
            set
            {
                _key = value;
            }
        }
        public string Value {
            get
            {
                return _value;
            }
            set
            {
                _value = value;
            }
        }
    }
}

我在调试控制台中看到的是

[0:] Binding: 'Value' property not found on 'MyApp.Models.Mode', target property: 'Xamarin.Forms.Picker.Display'

[0:] Binding: 'Value' property not found on 'MyApp.Models.Mode', target property: 'Xamarin.Forms.Picker.Display'

[0:] Binding: 'SelectedMode' property not found on 'MyApp.ViewModels.'MyApp', target property: 'Xamarin.Forms.Picker.SelectedItem'

就像我说的,如果我将它作为UWP应用程序运行,它可以工作,但是当我尝试在Android上运行时,它就无法工作。这就是我所能说的,因为这并没有真正说明问题是什么,除了以上不合理的错误之外。

其余部分的视图模型确实可以工作。应用程序的主要部分可以工作,我甚至可以在这个视图模型上运行代码。如果我创建一个简单的字符串绑定,那么它将可以工作,即使在Android上也是如此。

任何帮助都将不胜感激。


我能想到的唯一可能是Value和Key是关键字,所以为了排除这种情况,尝试将其改为Value1和Key1或其他名称。但对于SelectedMode来说并非如此,所以这很奇怪。 - Gerald Versluis
在构造函数中,尝试将模式列表设置为一个变量,然后将该变量分配给Mode。 - Daniel
刚刚尝试了两个,但是得到的结果完全相同。 - user875234
@user875234,你能解决这个问题吗?我也遇到了同样的问题。 - sahithi
@sahithi,这件事发生得太久了,我已经记不清楚了,但是我的回答在下面。可能只需要删除 bin 和 obj 文件夹并重新启动 Visual Studio 就可以了。 - user875234
3个回答

2

对我来说,答案完全是魔法。如果有人能解释一下,我会将您的回答标记为被接受的答案。

Anroid 项目文件 > 属性 > 链接 > 设置为无。

仍然无效,所以我关闭了 Visual Studio,并删除了 PCL 和 Android 项目中的 bin 和 obj 目录。最后它终于起作用了。

还有一件事就是现在似乎我失去了将链接设置为 sdk 和用户程序集的能力。如果我某个时刻需要它怎么办?


2
删除 bin 和 obj 文件夹可以有效解决一些奇怪的问题。我建议您阅读Xamarin.Android故障排除技巧 - Kapusch

2

使用单向绑定可以避免在调试控制台中出现这些绑定错误。

Text="{Binding [Name], Source={x:Static i18n:Translator.Instance}, Mode=OneWay}"

如果您需要双向绑定,请确保绑定的模型对象实现了INotifyPropertyChanged,就像Markus Michel所指示的那样。

0

你的模型类还需要实现INotifyPropertyChanged接口


在我的情况下,似乎没有它也能正常工作。由于文档非常浅显,只覆盖了顺利的路径,我并不确定什么是正确的。 - user875234
据我所知,只有在页面最初创建后属性发生更改时,INotifyPropertyChanged 才会起作用。因此,现在可能运行良好,但随着您进行更高级的应用程序编程,您可能会遇到这样一种情况:代码中的更改不会导致显示更新。如果是这样,请重新访问此问题:了解有关更新属性/动态属性/引发属性更改事件或方法的更多信息。 - ToolmakerSteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接