当前位置:  开发笔记 > 编程语言 > 正文

Xamarin - 绑定命令到User Control内对象的属性

如何解决《Xamarin-绑定命令到UserControl内对象的属性》经验,为你挑选了1个好方法。

我几天前就开始学习XAML了,我遇到了解决这个问题的麻烦.

在Xamarin Forms中,我想创建一个用户控件,它将包含一个标签和一个按钮,并能够将命令绑定到XAML中的usercontrol来自另一个使用我的用户控件的页面.

我目前正在例外:

Xamarin.Forms.Xaml.XamlParseException:'位置8:24.无法分配属性"Test1":属性不存在,或者不可分配,或者值和属性之间的类型不匹配'

这是我目前正在努力工作的一个愚蠢的版本.

我的自定义控件XAML



    
        

使用我的自定义控件XAML进行控制




    

我的自定义控件代码隐藏

using System.Windows.Input;
using Xamarin.Forms;

namespace App3.Controls
{
    public partial class Control1 : ContentView
    {

        private static readonly BindableProperty controlProperty = BindableProperty.Create("Test1", typeof(ICommand), typeof(Control1), null);

        public Control1()
        {
            InitializeComponent();
        }

        public ICommand Test1
        {
            get
            {
                return (ICommand)GetValue(controlProperty);
            }
            set
            {
                SetValue(controlProperty, value);
            }
        }

    }
}

使用自定义控件查看页面模型

using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Input;
using Xamarin.Forms;

namespace App3
{
    public class MainPageViewModel : INotifyPropertyChanged
    {
        public MainPageViewModel()
        {
            this.Test2 = new Command(test);
        }

        public void test()
        {
            Application.Current.MainPage.DisplayAlert("it works", "it works", "it works");
        }

        public ICommand Test2
        {
            get; set;
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Stephane Del.. 15

如果您希望从Xaml检测到可绑定的BindableProperty,则需要遵循一些命名约定:

创建标识符字段时,请在注册时按属性名称命名此字段,再加上后缀属性.此字段是依赖项属性的标识符,稍后将用作您将在包装器中进行的SetValue和GetValue调用的输入,通过您自己的代码,通过任何外部代码访问对该属性的任何其他代码访问.您可以通过属性系统允许,也可以通过XAML处理器.

将DependencyProperty标识符定义为所有者类型上的公共静态只读字段.

(这是DependencyProperty的文档,但在这种情况下它很适用于BindableProperties.请参阅https://msdn.microsoft.com/en-us/library/ms753358(v=vs.110).aspx)

您可以通过替换来修复代码

private static readonly BindableProperty controlProperty = BindableProperty.Create("Test1", typeof(ICommand), typeof(Control1), null);

public ICommand Test1
{
    get { return (ICommand)GetValue(controlProperty); }
    set { SetValue(controlProperty, value); }
}

通过

public static readonly BindableProperty Test1Property = BindableProperty.Create("Test1", typeof(ICommand), typeof(Control1), null);


public ICommand Test1
{
    get { return (ICommand)GetValue(Test1Property); }
    set { SetValue(Test1Property, value); }
}

这应该可以防止属性检测问题.

让你充满东西的工作,按钮命令结合应该有它的源设置为控制本身,你应该设置你MainPageViewModelBindingContextMainPage.



1> Stephane Del..:

如果您希望从Xaml检测到可绑定的BindableProperty,则需要遵循一些命名约定:

创建标识符字段时,请在注册时按属性名称命名此字段,再加上后缀属性.此字段是依赖项属性的标识符,稍后将用作您将在包装器中进行的SetValue和GetValue调用的输入,通过您自己的代码,通过任何外部代码访问对该属性的任何其他代码访问.您可以通过属性系统允许,也可以通过XAML处理器.

将DependencyProperty标识符定义为所有者类型上的公共静态只读字段.

(这是DependencyProperty的文档,但在这种情况下它很适用于BindableProperties.请参阅https://msdn.microsoft.com/en-us/library/ms753358(v=vs.110).aspx)

您可以通过替换来修复代码

private static readonly BindableProperty controlProperty = BindableProperty.Create("Test1", typeof(ICommand), typeof(Control1), null);

public ICommand Test1
{
    get { return (ICommand)GetValue(controlProperty); }
    set { SetValue(controlProperty, value); }
}

通过

public static readonly BindableProperty Test1Property = BindableProperty.Create("Test1", typeof(ICommand), typeof(Control1), null);


public ICommand Test1
{
    get { return (ICommand)GetValue(Test1Property); }
    set { SetValue(Test1Property, value); }
}

这应该可以防止属性检测问题.

让你充满东西的工作,按钮命令结合应该有它的源设置为控制本身,你应该设置你MainPageViewModelBindingContextMainPage.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有