每当属性更改时,如何将XAML视图的属性绑定到背后代码中的公共变量

时间:2019-09-17 16:45:07

标签: c# xaml xamarin xamarin.forms

我试图从XAML控件中获取一个属性,尤其是TranslationX属性,并在每次更改值时将其存储在公共变量中。

我尝试通过实现INotifyPropertyChanged接口并将TranslationX属性绑定到我的接口实现中的公共变量来使用数据绑定,但是没有运气

基本上,我需要一个控件的TranslationX属性来根据总位移来触发函数调用,例如。如果控件在X方向上拖动到-200,则会触发功能“ Y”。我似乎无法以允许我检查它是否在某个值之上或之下的方式访问此转换值。

我对C#和Xamarin还是很陌生,因此非常感谢您提出任何建议。

编辑:

这是我当前的ViewModel类:

public class ReceiptPageViewModel : INotifyPropertyChanged
{
    double shift = 0;

    public double Shift
    {
        get => shift;
        set
        {
            if (shift == value)
                return;
            else
            {
                shift = value;
                OnPropertyChanged(nameof(Shift));
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    void OnPropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

这是我绑定的语法:

TranslationX="{Binding Shift}"

2 个答案:

答案 0 :(得分:0)

在您的XAML中

<SomeElement ... TranslationX="{Binding TransX}" ... />

在您的ViewModel中

double transX;

public double TransX {
  get { return transX; }
  set {
    transX = value;

    if (transX > somethresholdvalue) {
      ...
    }
  }
}

答案 1 :(得分:0)

遵循 MVVM pattern
使用INotifyPropertyChanged创建基本视图模型。 然后,您的自定义视图模型将从该基类继承。


BaseViewModel

public class BaseViewModel : INotifyPropertyChanged
{ 

    bool isBusy = false;
    public bool IsBusy
    {
        get { return isBusy; }
        set { SetProperty(ref isBusy, value); }
    }

    string title = string.Empty;
    public string Title
    {
        get { return title; }
        set { SetProperty(ref title, value); }
    }

    protected bool SetProperty<T>(ref T backingStore, T value,
        [CallerMemberName]string propertyName = "",
        Action onChanged = null)
    {
        if (EqualityComparer<T>.Default.Equals(backingStore, value))
            return false;

        backingStore = value;
        onChanged?.Invoke();
        OnPropertyChanged(propertyName);
        return true;
    }

    #region INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        var changed = PropertyChanged;
        if (changed == null)
            return;

        changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion

您的自定义类:
ReceiptPageViewModel

public class ReceiptPageViewModel : BaseViewModel
{
    double shift = 0;
    public double Shift
    {
        get { return shift; }
        set { SetProperty(ref shift, value); }
    }
}

然后在您的Xamarin页面中将BindingContext设置为ViewModel
(这是一个例子)

public partial class Page1 : ContentPage
{
    private ReceiptPageViewModel viewModel;
    public Page1()
    {
        BindingContext = viewModel = new ReceiptPageViewModel();
        InitializeComponent();
    }
}

现在,您可以在 XAML 视图中设置属性:

<SomeElement ... TranslationX="{Binding Shift}" ... />

在这里您可以使用@JamesMontemagno作为主持人来观看有关MVVM Pattern的完整剧集。