Bindet den Numpad-Text basierend auf der angeklickten Schaltfläche entweder an die Menge oder den EinzelpreisC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Bindet den Numpad-Text basierend auf der angeklickten Schaltfläche entweder an die Menge oder den Einzelpreis

Post by Anonymous »

Eigentliches Projekt
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
mit BindingContext auf ItemViewModel hat beispielsweise ein Label, das an Quantity gebunden ist, und ein weiteres Label, das an UnitPrice und gebunden ist ein Numpad.
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;
}
Ein benutzerdefiniertes Steuerelement Numpad:

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();
}
}
und sein XAML:

Code: Select all






Beide werden dann in MainPage wie folgt verwendet:

Code: Select all

public MainPage()
{
InitializeComponent();
BindingContext = new ItemViewModel { Quantity = 3, Price = 5 };
}

Code: Select all
















Erwartetes Verhalten
  • 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.
Leider funktioniert es nicht, der Text der ausgewählten Schaltfläche ändert sich nicht, wenn auf die Numpad-Schaltfläche geklickt wird.
Was ist das? Schuldiger? Ich stecke seit fast 6 Monaten mit diesem Problem fest.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post