我正在尝试将 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 set
至set
然后,您将看到显示的消息,显示当前正确的值,如 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/