WPF binding ProgressBar?
Hallo,
wie kann ich am besten die ProgressBar binden ?
Wenn ich im XAML meine ProgressBar so definiere:
Versuche ich im ViewModel das so aufzurufen:
Ich möchte die Animation im Code Steuern können so in etwa:
Denke wenn ich die Value von der ProgressBar binde möchte er einen Int-Wert.
mit x:Name oder Name funktioniert es auch nicht.
Fehlermeldung: Nullreferenceexception
Wie binde ich die ProgressBar also richtig ?
3 Antworten
Hallo :)
Du versucht mit deinem Code den du gezeigt hast, dass du eine ProgessBar an den Value einer ProgessBar bindest.
Was du machen musst, ist einen INT in dein ViewModel zu packen. Mach einfach aus deiner ProBar einen INT und es wird gebunden sein.
Nein, ich habe, wie du geschrieben hast, meine Oberfläche von der Logik getrennt.
Die Ausschnitte hier sind nur ein test beispiel eines größeren Projektes.
Ich habe es so aufgebaut:
Standart MainWindow ist ein verweiß auf ein UserControl, dieses UserControl ist meine MainView, und den DataContext habe ich in deiner beschriebenen Methode gespeichert.
TastCommand = new MyCommand(async () =>
{
IsIntermediateProgessBar = true;
await DoWorkAsync();
MessageBox.Show("Erfolgreich");
IsIntermediateProgessBar = false;
}, () => true);
Wenn ich zbs im konstruktor oder in einer Methode dein beispiel anwende funktioniert es einwandfrei, sobald ich es aber in mein befehl einfüge (was async läuft) funktioniert es nicht mehr.
Ne Idee warum ?
Achtung, habe nochmal kurz nachgedacht. Natürlich kannst du ein ViewModel verwenden! Solltest du vielleicht sogar. Wie voran gesagt, ist es da um Logik und UI zu trennen! Binde dazu einfach einen BOOL an die ProgessBar Eigenschaft IsIntermediate in deinem XAML. Benennen die Eigenschaft in deinem ViewModel IsItermediateProgessBar. ==> <ProgressBar IsIndeterminate="{Binding IsIntermediateProgessBar}" />
kleiner Nachtrag: es ist eher nicht der Fall das gesamte Control zu binden. Denn das ViewModel soll dabei helfen die UI und die Logik von einander abzutrennnen.
Das Problem ist wenn ich das mache kann ich im Code nicht mehr die => IsIndeterminate umschalten, also von false auf true.
Was ich machen möchte ist wenn der User auf einem Button Klickt das IsIndeterminate auf true gesetzt wird und nach abschluss wieder auf false.
Gebe deiner ProgessBar im XAML die Eigenschaft x:Name="ProBar" und du kannst das machen. Kein ViewModel für diesen Fall nötig.
Entschuldigung beim letzten bild sollte am Anfang folgendes stehen =>
ProBar.IsIndeterminate = true;
AFAIK funktionieren Progress-Bars am Besten über Background-Worker. Ansonsten kannst du auch ein Dispatch.Invoke machen, z.B
Dispatcher.Invoke(()=>
{
ProgressBar.Value = 5;
});
Wenn das zu schnell geht kannst du auch im Dispatcher Invoke ein Thread Sleep machen
Kann es sein das dein "ViewModel" in der Klasse MainWindow.xaml.cs ist? Das ist eigentlich keine gute Idee. Du kannst das ViewModel in eine andere Klasse auslagern. Und über den ==> this.DataContext = myViewModel BINDEST du das ViewModel an deine UI. Am besten in der InitalizeComponent() Methode. So hast du eine klare seperation zwischen deiner Logik (MainWindow.xaml.cs), deinem ViewModel und deiner UI.