- при нажатии кнопки Ping затем к сообщению добавляется звездочка *..
- если нажата кнопка Pong, то последний символ в сообщении будет удалено.
{
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(PongCommand))]
string _message = string.Empty;
bool IsMessageNotEmpty => Message != string.Empty;
[RelayCommand]
void Ping() => Message += "*";
[RelayCommand(CanExecute = nameof(IsMessageNotEmpty))]
void Pong() => Message = Message.Substring(0, Message.Length - 1);
}
public partial class PingPongView : ContentView
{
public static readonly BindableProperty MessageProperty =
BindableProperty.Create(
propertyName: nameof(Message),
returnType: typeof(string),
declaringType: typeof(PingPongView),
defaultBindingMode: BindingMode.TwoWay,
propertyChanged: OnMessagePropertyChanged);
public string Message
{
get => (string)GetValue(MessageProperty);
set => SetValue(MessageProperty, value);
}
static void OnMessagePropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
var view = (PingPongView)bindable;
view._model.Message = (string)newValue;
}
PingPongViewModel _model;
public PingPongView()
{
InitializeComponent();
_model = new PingPongViewModel();
BindingContext = _model;
}
}
Я использовал PingPongView в MainPage следующим образом:
К сожалению, в обоих случаях элементы управления Text Entry не отражают изменения в PingPongView. Что я здесь не так?
Мне удалось заставить это работать. Я удалил PingPongViewModel и объединил некоторые ее части с PingPongView следующим образом:
public partial class PingPongView : ContentView
{
public static readonly BindableProperty MessageProperty =
BindableProperty.Create(
propertyName: nameof(Message),
returnType: typeof(string),
defaultValue: string.Empty,
declaringType: typeof(PingPongView),
defaultBindingMode: BindingMode.TwoWay,
propertyChanged: OnMessagePropertyChanged);
public string Message
{
get => (string)GetValue(MessageProperty);
set => SetValue(MessageProperty, value);
}
static void OnMessagePropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
var view = (PingPongView)bindable;
view.PongCommand.NotifyCanExecuteChanged();
}
bool IsMessageNotEmpty => Message != string.Empty;
[RelayCommand]
void Ping() => Message += "*";
[RelayCommand(CanExecute = nameof(IsMessageNotEmpty))]
void Pong() => Message = Message.Substring(0, Message.Length - 1);
public PingPongView()
{
InitializeComponent();
}
}
Тогда кнопки в XAML привязываются к командам с помощью Source={RelativeSource ...:
Наконец, я использовал PingPongView в MainPage четырьмя способами:
Случай 1
Примечание: Text="" в записи является обязательным. Удаление Text="" из записи приводит к тому, что Message становится нулевым.
Случай 2
Примечание: Text="" в записи является обязательным. Удаление Text="" из записи приводит к тому, что Message становится нулевым.
Случай 3
Случай 4
Подробнее здесь: https://stackoverflow.com/questions/790 ... er-control