Ich möchte ein wiederverwendbares Steuerelement Numpad erstellen, das über eine bindbare Eigenschaft Text verfügt. Durch Drücken einer beliebigen Taste im Numpad wird eine Eigenschaft geändert, die an Numpads Text gebunden ist.
Ein Ansichtsmodell ItemViewModel kapselt die Menge und UnitPrice.
Code: Select all
MainPage
Wenn auf die erste Beschriftung getippt wird, wird der Numpad-Text an die Menge gebunden. Wenn auf die zweite Beschriftung getippt wird, wird der Numpad-Text an UnitPrice gebunden.
Bedenken Sie die folgende Abbildung:
< img alt="Bildbeschreibung hier eingeben" src="https://i.sstatic.net/e8pIcGWv.png" />
Minimaler Code
Der Einfachheit halber lassen Sie mich Simulieren Sie den Nummernblock mit nur zwei Tasten. Sie erhöhen oder verringern lediglich einen an Text gebundenen Wert.
Lassen Sie mich außerdem zwei Schaltflächen anstelle von zwei Beschriftungen verwenden, um Numpads Text programmgesteuert an eine der beiden Mengen oder UnitPrice.
Code: Select all
public partial class ItemViewModel : ObservableObject
{
[ObservableProperty]
double _quantity;
[ObservableProperty]
double _price;
[ObservableProperty]
string _selectedProperty;
[RelayCommand]
void SetSelectedProperty(string selectedProperty)
=> SelectedProperty = selectedProperty;
}
Code: Select all
public partial class Numpad : ContentView
{
double? _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 (double.TryParse(Text, out double x))
{
_value = x;
return true;
}
_value = null;
return false;
}
);
DownCommand = new Command(
execute: () =>
{
Text = $"{_value - 1}";
},
canExecute: () =>
{
if (double.TryParse(Text, out double x))
{
_value = x;
return _value > 0;
}
_value = null;
return false;
}
);
InitializeComponent();
}
}
Code: Select all
Code: Select all
public MainPage()
{
InitializeComponent();
BindingContext = new ItemViewModel { Quantity = 3, Price = 5 };
}
Code: Select all
- Das Klicken auf eine der ersten beiden Schaltflächen sollte den Text des Numpads binden< /code> entweder auf Menge oder Einzelpreis umstellen.
- Durch Klicken auf eine beliebige Schaltfläche im Numpad sollte sich die an Numpad gebundene Eigenschaft ändern Text.
Was ist das? Schuldiger? Ich stecke seit fast 6 Monaten mit diesem Problem fest.