WPF Click_Event Methoden aus der CodeBehind Auslagern(ins ViewModel)
-
Hallo!
Ich Möchte gern meine Button Click Methode in einer extra Klasse haben.
in der Code Behind soll nichts stehen.also ein einfaches Fenster.
<Window x:Class="RoutedEvTest.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:clg="clr-namespace:RoutedEvTest" Title="Window1" Height="300" Width="300"> <Window.Resources> <clg:Logic x:Key="Test"/> </Window.Resources> <Grid> <StackPanel Button.Click="StackPanel_Click"> <!-- Wie Binde ich das nun? --> <Button>Button 1</Button> <Button>Button 2</Button> <Button>Button 3</Button> <Button>Button 4</Button> </StackPanel> </Grid> </Window>
Logic class
namespace RoutedEvTest { public class Logic { public Logic() { } private void StackPanel_Click(object sender, System.Windows.RoutedEventArgs e) { if (e.Source is System.Windows.Controls.Button) { System.Windows.Controls.Button btn = e.Source as System.Windows.Controls.Button; System.Windows.MessageBox.Show(btn.Content as string); } } } }
Code Bebind
namespace RoutedEvTest { public partial class Window1 : Window { public Window1() { InitializeComponent(); } } }
Danke schonmal
-
http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
oder gleich die große Runde
http://msdn.microsoft.com/en-us/library/dd458807.aspx
In dem Composite Application Guidance gibt es die Klassen RelayCommand, DelegateCommand und CompositeCommand mit denen die die RoutedCommands aus dem View in das ViewModel bekommst.
-
Geht das nur über routedcommands?
sollte doch auch mit routedeventargs gehen.
-
RoutedCommands != RoutedEventArgs
Apfel != BirneRoutedCommands sind wie der Name bereits sagt: Commands
und RoutedEventArgs sind Argumente.
Sind zwei unterschiedliche Sachen.Binde den Command des Buttons gegen ein ICommand im Code, als Parameter kannst CommantArgs in der Xaml direkt binden.
Note: Wenn du MVVM Programmieren willst => Die ViewModels arbeiten nicht mit den UI Elementen, wenn du den Text des Buttons brauchst (wüsste aber nicht wozu) übergebe es als Parameter.
Hier mal ein Beispiel
Xaml:
<Button Content="Bla" Command="{Binding BlaCommand}" CommandParameter="Bla was clicked" />
VM:
private Bla(object param) { if (param != null) UI.ShowDialog<MessageBoxView>(this, new MessageBoxViewModel(param.ToString(), "Demo")); } public ICommand BlaCommand { get { if (_blaCommand == null) _blaCommand = new DelegateCommand(p => Bla(p)); return _blaCommand; } } private ICommand _blaCommand { get; set; }
Du scheinst noch in der Lernphase von MVVM zu sein, sehe ich das richtig?
-
Danke erstmal für eure Antworten.
CSL schrieb:
RoutedCommands != RoutedEventArgs
Apfel != BirneIch weiß, ich wollte halt nur die StackPanel_Click Methode auslagern, und keine
Commands nutzen.Ja bin noch in der Lernphase, ist ne ganz andere Art zu programmieren.
Ab wann lohnt es sich MVVM anzuwenden, oder sollte man es immer anwenden?
Die Vorteile sind mir bekannt, aber macht es immer Sinn, so einen
Aufwand zu betreiben?Und mal ne andere Frage. Man sagt immer, so sind Code und Design 100% voneinander getrennt. Was ja schön und gut ist.
Man Will wohl auch nicht , dass der Designer uns vorschreibt wie
unsere Methoden zu heißen haben etc.Aber mal ganz ehrlich, welcher Designer beherrscht Expression Blend / Design.
Die meisten erstellen doch Graphiken(Vector/Pixel) in Photoshop/Illustrator und
dann darf der Programmierer sich das selbst zusammenbauen, oder habt ihr da
andere Erfahrungen gemacht?
-
> Ich weiß, ich wollte halt nur die StackPanel_Click Methode auslagern, und keine Commands nutzen.
In WPF mit MVVM benutzt man immer Commands, und der Button Command wird genauso ausgelöst wie ein Click event.> Ab wann lohnt es sich MVVM anzuwenden, oder sollte man es immer anwenden?
Ist persönliche vorliebe.> Aber mal ganz ehrlich, welcher Designer beherrscht Expression Blend / Design.
Blend / Design ist noch nicht alt genug, die Verbreitung und der Kenntnisstand fehlt noch.Sieh das einfach so, als Entwickler kannst du schon mit einer Dummy UI alles fertig machen, wenn der Designer dann mit seiner Lösung ankommt, brauchst du nur noch die UI anpassen ohne den Code zu ändern.
Oder der Designer hat ein Änderungswunsch, das geht dann auch direkt ohne den Code zu ändern.