Пользовательский элемент управления не может обновить другой элемент управленияC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Пользовательский элемент управления не может обновить другой элемент управления

Сообщение Anonymous »

Чтобы проиллюстрировать проблему, я создал пользовательский элемент управления PingPongView со следующим поведением:
  • при нажатии кнопки Ping затем к сообщению добавляется звездочка *..
  • если нажата кнопка Pong, то последний символ в сообщении будет удалено.
public partial class PingPongViewModel : ObservableObject
{
[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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»