Программно переключение контекста привязки иногда не запускает CANEXECUTEC#

Место общения программистов C#
Ответить
Anonymous
 Программно переключение контекста привязки иногда не запускает CANEXECUTE

Сообщение Anonymous »

Рассмотрим следующий скриншот, чтобы объяснить мой упрощенный сценарий.
У меня есть < /p>
  • Пользовательский элемент управления Numpad < /code> с двумя кнопками вверх < /code> и down и текст связываемого свойства . Нажатие и вниз увеличит и уменьшает значение текста соответственно. Кнопка вниз отключена всякий раз, когда текст достигает 0 .
  • Страница состоит из 2 радиопроизводительных кнопок и Unitprice и numpad .
  • На странице используется модель представления itemviewmodel , в которой есть два свойства Количество и Unitprice .

    Код: Выделить всё

    Numpad Text  связан с количеством COUTITY 
    или UNITPRICE в зависимости от того, какая радиопроизводительная кнопка выбрасывается.

Как видите, вниз кнопка должна быть отключена, потому что numpad текст равен 0 . Но это не так. Что такое виновник?
public partial class Numpad : ContentView
{
private int? _value;

public static readonly BindableProperty TextProperty =
BindableProperty.Create(
propertyName: nameof(Text),
returnType: typeof(string),
defaultValue: "0",
defaultBindingMode: BindingMode.TwoWay,
declaringType: typeof(Numpad),
propertyChanged: (bindable, oldValue, newValue) =>
{

var @this = (Numpad)bindable;
((Command)@this.UpCommand).ChangeCanExecute();
((Command)@this.DownCommand).ChangeCanExecute();
});

public string Text
{
get => (string)GetValue(TextProperty);
set => SetValue(TextProperty, value);
}

public ICommand UpCommand { get; }
public ICommand DownCommand { get; }

public Numpad()
{
UpCommand = new Command(
execute: () =>
{
Text = $"{_value + 1}";
},
canExecute: () =>
{
if (int.TryParse(Text, out int x))
{
_value = x;
return true;
}

_value = null;
return false;
}
);

DownCommand = new Command(
execute: () =>
{
Text = $"{_value - 1}";
},
canExecute: () =>
{

if (int.TryParse(Text, out int x))
{
_value = x;
return _value > 0;
}

_value = null;
return false;
}
);
}
< /code>







public class ItemViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

private int _quantity;
private int _unitPrice;
public int Quantity
{
get { return _quantity; }
set
{
_quantity = value;
OnPropertyChanged();
}
}
public int UnitPrice
{
get { return _unitPrice; }
set
{
_unitPrice = value;
OnPropertyChanged();
}
}
}

public partial class ChangerPage : ContentPage
{
public ChangerPage()
{
BindingContext = new ItemViewModel { Quantity = 3, UnitPrice = 5 };
InitializeComponent();
RadioButtonQuantity.IsChecked = true;
}
private void RadioButton_CheckedChanged(object sender, CheckedChangedEventArgs e)
{
if (e.Value)
{
var rb = sender as RadioButton;
if (rb == RadioButtonQuantity)
{
cv.SetBinding(Numpad.TextProperty, nameof(ItemViewModel.Quantity));
}
if (rb == RadioButtonUnitPrice)
{
cv.SetBinding(Numpad.TextProperty, nameof(ItemViewModel.UnitPrice));
}
}
}
}
< /code>









Подробнее здесь: https://stackoverflow.com/questions/793 ... canexecute
Ответить

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

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

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

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

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