c# - Xaml 条目 MVVM 数据绑定(bind)

标签 c# xaml mvvm data-binding xamarin.forms

我正在尝试将 Xaml 中的条目连接到 ViewModel。
问题是条目不会触发 PropertyChanged 事件。

  <Entry FontSize="Large"
         Placeholder="3"
         Keyboard="Numeric"
         Text="{Binding BaseValue, StringFormat='{0}', Mode=TwoWay}" />

Consturter 使用值初始化条目,该值会触发 PropertyChanged,但是当我在 Textfield 中输入内容时,显示的字段会更改,但不会触发 PropertyChanged...
我知道我可以在 View 中使用 OnEntryTextChanged 事件,但我想使用数据绑定(bind)来获得“完美”MVVM。有没有可能做到这一点?
class PowersViewModel: BaseViewModel
    {
     double baseValue = 4;
     public PowersViewModel()
            {BaseValue = baseValue;}
     public double BaseValue
            {
                private set
                {
                    SetProperty(ref baseValue, value);
                }
                get
                {
                    return baseValue;
                }
            }
}
public class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected bool SetProperty<T>(ref T storage, T value,
                                  [CallerMemberName] string propertyName = null)
    {
        if (Object.Equals(storage, value))
            return false;

        storage = value;
        OnPropertyChanged(propertyName);
        return true;
    }

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

最佳答案

在您的 PowersViewModel你正在做:-

public double BaseValue
{
    private set
    {
        SetProperty(ref baseValue, value);
    }
    get
    {
        return baseValue;
    }
}

通过这样做,您对 Entry 所做的任何更改不会存储回您的ViewModel .

如果您将此属性更改为:-
public double BaseValue
{
    set
    {
        SetProperty(ref baseValue, value);
    }
    get
    {
        return baseValue;
    }
}

您将看到更改保留在您的 ViewModel 中。 .

试试下面的例子,它也显示 Button您可以单击以检查 ViewModel 中的值它将显示实际值的警报。如果您更改 private setset然后,您将看到显示的消息,显示当前正确的值,如 Entry 中所示。控制。

示例:-
StackLayout objStackLayout = new StackLayout();

Entry objEntry = new Entry()
{
    FontSize = 20,
    Placeholder = "3",
    Keyboard = Keyboard.Numeric
};
//
objEntry.SetBinding(Entry.TextProperty, "BaseValue", BindingMode.TwoWay);
objStackLayout.Children.Add(objEntry);


PowersViewModel objViewModel = new PowersViewModel();

this.BindingContext = objViewModel;


Button objButton  = new Button();
objButton.Text = "Check value";
objButton.Clicked+=((o2,e2)=>
{
    DisplayAlert("",string.Format("BaseValue={0}", objViewModel.BaseValue), "OK");
});
objStackLayout.Children.Add(objButton);

支持类 :-
class PowersViewModel : BaseViewModel
{
    double baseValue = 4;
    public PowersViewModel()
    { BaseValue = baseValue; }
    public double BaseValue
    {
        //private set - incorrect!
        set
        {
            SetProperty(ref baseValue, value);
        }
        get
        {
            return baseValue;
        }
    }
}

关于c# - Xaml 条目 MVVM 数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35470302/

相关文章:

xaml - 你如何利用 flipview 并通过点击或点击屏幕来制作 "selection"?

javascript - Knockoutjs View 定位器?

windows-phone-8 - Caliburn Micro和麦克风NullReferenceException

Silverlight 单元测试(数据绑定(bind)、MVVM)

c# - .NET 无需自动化即可从标签中读取文本

c# - 如何模拟函数空间

c# - 检测鼠标点击是否命中不在列表框中的项目 [C#]

c# - 在按钮上打开一个新窗口单击 WPF MVVM

wpf - View-First-MVVM 中的用户控件和 View 模型

c# - 调试 Windows 8 的 XAML 解析错误的过程