У меня есть < /p>
- Пользовательский элемент управления Numpad < /code> с двумя кнопками вверх < /code> и down и текст связываемого свойства . Нажатие и вниз увеличит и уменьшает значение текста соответственно. Кнопка вниз отключена всякий раз, когда текст достигает 0 .
- Страница состоит из 2 радиопроизводительных кнопок и Unitprice и numpad .
- На странице используется модель представления itemviewmodel , в которой есть два свойства Количество и Unitprice .
или UNITPRICE в зависимости от того, какая радиопроизводительная кнопка выбрасывается.
Код: Выделить всё
Numpad Text связан с количеством COUTITY
Как видите, вниз кнопка должна быть отключена, потому что 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
Мобильная версия