c# projekt

  • Zitat

    muss ich das jetzt wirklich für jede einzelne textbox einzeln so implementieren? das wäre doch ein schritt zurück... ich möchte code doch wiederverwenden können. ist es möglich, das objekt mitzugeben welches das command ausgelöst hat? ich mache es so bei meiner input-box um anhand des names des buttons den entsprechendenen buchstaben hinzuzufügen:


    Code
    1. private void Key_Click(object sender, RoutedEventArgs e)
    2. {
    3. var button = (Button)sender;
    4. ....


    Verwende nicht die InputBindings-Property der Textbox, sondern das Click-Event, welches ebenfalls Teil der TextBox ist, dann geht's ganz leicht: *click*

  • so einfach war es leider nicht. habe es so gelöst:


    view:

    Code
    1. <Button Content="TextCommand" Height="50" Width="100" Margin="102,211,98,39">
    2. <i:Interaction.Triggers>
    3. <i:EventTrigger EventName="Click">
    4. <cmd:EventToCommand PassEventArgsToCommand="True"
    5. Command="{Binding TestEventCommand}" />
    6. </i:EventTrigger>
    7. </i:Interaction.Triggers>
    8. </Button>


    viewmodel:

    Code
    1. public RelayCommand<RoutedEventArgs> TestEventCommand { get; private set; }


    Code
    1. TestEventCommand = new RelayCommand<RoutedEventArgs>((e) => ExecuteTestEventCommand(e));



    ist das der weg, wie es richtig gemacht wird? vorallem, dass ich dem element.Content direkt wieder etwas zuweise ist doch irgendwie "murks" nicht? funktionieren tut es aber soweit ;)

  • es wird verschiedene user-levels geben. je nach user sind gewisse funktionen (buttons) gesperrt. mein VM hat also ein property CurrentUserLevel (int). wie kann ich nun meinen buttons sagen, dass sie nur enabled sind wenn CurrentUserLevel einen bestimmten Wert übersteigt?

  • ferien vorbei, weiter gehts ;)


    ich habe eine seite, auf der neue benutzer angelegt werden können. dazu im VM:


    diese daten stelle ich mit einem ListView dar. ich kann neue benutzer hinzufügen, bestehende verändern oder löschen. alles wunderbar.


    nun muss ich auf diese daten zugreifen können, um beim einloggen zu schauen ob ein entsprechender user überhaupt vorhanden ist. wie kann ich aus einem VM auf die daten in einem anderen VM zugreifen?

  • Ich weiss nicht, ob das die formell korrekte Lösung für das Problem ist, aber zur Kommunikation zwischen VMs verwende ich meistens Messaging.


    - Unter "Models" (wo auch deine User definiert sein sollten), erstellst du deine Mitteilungen, beispielsweise eine UserQueryMessage.


    - Du bindest GalaSoft.MvvmLight.Messaging ein


    - Das VM mit den Benutzerkonten registriert sich im Konstruktor bei dem Messaging-Dienst und abonniert UserQueryMessages:
    Messenger.Default.Register<Messages.UserQueryMessage>(this, x => UserQueryMessage(x));


    - In der VM stellst du die Methode UserQueryMesssage zur Verfügung, welche die entsprechenden Checks durchführt.


    - Das VM, welche wissen möchte, ob der Benutzer vorhanden ist, stellt über den Messaging-Dienst die entsprechende Anfrage:
    Messenger.Default.Send<Messages.UserQueryMessage>(new Messages.UserQueryMessage() { Username = _user, Password = _pw });


    So bleibt auch die Liste der User ausschliesslich in dem einen VM verwaltet und die Zugriffe darauf geschützt.

  • bin mal wieder auf eure hilfe angewiesen.


    ich habe auf meiner hauptseite buttons, mit denen ich die VMs und somit die views wechseln kann. soweit sogut. nun habe ich aber mehr views als ich buttons habe, also möchte ich je nach aktiver view die buttons in ihrer funktion entsprechend ändern. mit dem text für den button funktioniert es schon prima. ich habe dazu eine eigene vmbase erstellt welche testweise über eine string-property verfügt. alle anderen VMs erben von dieser klasse.


    Code
    1. public abstract class MyViewModelBase : ViewModelBase
    2. {
    3. public string Text { get; set; }
    4. public MyViewModelBase()
    5. {
    6. }
    7. }


    im MainViewModel kann ich nun den text des buttons je nach aktivem VM entsprechend ändern:


    Code
    1. stR9 = CurrentViewModel.Text;


    der text des buttons ändert also je nach aktivem VM. das funktioniert schon. wie aber speichere ich in meinem VM, welches VM beim drücken des buttons als nächstes dran ist?


    momentan werden die seite so gewechselt:

    Code
    1. CurrentViewModel = MainViewModel._homeViewModel;
  • Aus der VM heraus wechsle ich die Views auch per Messaging.




    Zitat

    In einer bestimmten View drin, beispielsweise View A:
    Messenger.Default.Send<Messages.ChangeScreenMessage>(new Messages.ChangeScreenMessage() { PageName = Messages.ViewName.B, ... });


    Nun kannst du noch den Command des Buttons mit einem Switch-Statement über die jetzige View ergänzen oder sowas und basierend darauf unterschiedliche Messages senden

  • stehe mal wieder auf dem schlauch. hat eigentlich mit dieser frage hier zu tun: http://stackoverflow.com/quest…for-property-of-an-object


    ich habe ein objekt mit mehreren boolschen eigenschaften. hier auf eine reduziert:



    im VM


    das binden auf die einzelnen elemente von MainStatus funktionert:

    Code
    1. Binding="{Binding MainStatus.Safety}"


    nun brauche ich diesen MainStatus auch in anderen VMs. ich habe bisher gute erfahrungen mit den messages gemacht, also wollte ich bei jeder änderung eine nachricht absenden:


    dies funktioniert aber nicht. auch wenn ich diese zeile testweise mit einer MessageBox.Show("test"); ersetze bekomme ich diese nie zu sehen. ich befürchte also, dass RaisePropertyChanged für MainStatus nie durchlaufen wird. was mache ich hier falsch?

  • so, für bisher alle probleme habe ich mittlerweile eine lösung gefunden und es geht langsam gegen das ende zu :) hier aber noch eine grundsatzfrage: ich nehme labels, um den zustand einer variable in der sps darzustellen (grün = true, weiss = false). das funktioniert wunderbar. ich erstelle ein model, welches die daten aus der sps darstellt, bereite diese im viewmodel auf und speichere sie in entsprechenden properties auf welche die view dann binden kann. mit einem style-setter stelle ich dann die hintergrundfarbe ein.


    ich könnte aber auch ein custom control erstellen, welches selbst die entsprechende variable aus der sps liest und den hintergrund einstellt. damit würde die view (bzw. ein view element) plötzlich selber eine verbindung zur sps aufbauen und da daten lesen. dies würde aber mvvm verletzen, richtig?

  • Also falls es mehr als ein binding (+ style,..) in der View braucht - also wirklich logik wie ".Connect(..)" oder ".ReadVariable(229) as long", dann ja - das soll nicht ins code behind sondern wohin wo du es gut unit testen kannst.


    Du kannst aber z.B. ein Control "SpsBooleanDisplayControl : Label" machen, damit du nicht immer den richtigen Labels den richtigen Style verpassen musst. Das Control braucht dann ein dependency property (zum binden) auf die richtige variable.

    Marktplatz Bewertung
    Kiste 1: Sloti 800 TB
    Kiste 2: DLT3C @ 2.6GhZ
    ...
    Kiste 7 & Kiste 8: PhII 720BE, 8GB ram. 1x mit X25-m II 80GB & 4870, 1x mit indilinx MLC 32GB

    [SIZE=7]Dieser Beitrag, inkl. vorhandenen Anhängen, ist ungeschützt und könnte während der Übermittlung oder nachträglich von 3. verändert werden. Der Absender schliesst deshalb jede Haftung oder rechtliche Verbindlichkeit für elektronisch versandte Nachrichten aus. Weiter ist der Inhalt des Postings frei erfunden, eventuelle Annäherungen an die Realität sind höchstens unbeabsichtigt und zufällig entstanden. Zu all meinen PCs haben mehrere Leute Zugang und nutzen diesen auch.[/SIZE]

  • genau das wäre eben im code behind...


    die andere überlegung war dann genau das, dass ich zumindest den style und das verhalten zusammenfasse für alle labels dieser sorte.


    danke