我正在尝试从 XAML 控件中获取一个属性,特别是 TranslationX 属性,并在每次更改值时将其存储在公共变量中。
我尝试通过实现 INotifyPropertyChanged 接口并将 TranslationX 属性绑定到我的接口实现中的公共变量来使用数据绑定,但没有运气
本质上,我需要控件的 TranslationX 属性来根据总位移触发函数调用,例如,如果控件在 X 方向上拖动到 -200,它会触发函数"Y"。我似乎无法以允许我检查它是高于还是低于某个值的方式访问此翻译值。
我对 C# 和 Xamarin 非常陌生,因此非常感谢任何建议。
编辑:
这是我当前的视图模型类:
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}"
在你的XAML 中
<SomeElement ... TranslationX="{Binding TransX}" ... />
在您的视图模型中
double transX;
public double TransX {
get { return transX; }
set {
transX = value;
if (transX > somethresholdvalue) {
...
}
}
}
遵循MVVM 模式。
使用INotifyPropertyChanged
创建基础视图模型。 然后,您的自定义视图模型将从该基类继承。
基本视图模型
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
您的自定义类:
收据页面视图模型
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}" ... />
在这里,您可以查看有关MVVM 模式的完整剧集,@JamesMontemagno 作为主机。