Command erstellen C#

Du kannst aber nicht einfach im Code Behind die Text-Property setzen und darauf hoffen, dass das Binding das übernimmt. Es macht auch keinen Sinn. Den Inhalt deines TextBlocks da setzt du AUSSCHLIESSLICH mit der Property des Bindings im ViewModel. NIEMALS anders, außer du weißt was du tust.
Schreib TextBlockText = "Keine ID gefunden!" in dein ViewModel ins Init rein oder so und alles ist tutti. Aber so wird das nix.
toma123 schrieb:
Langsam aber sicher verliere ich immer mehr den Faden.
Weil du die Grundlagen nicht beherrscht. Du solltest dich wirklich erstmal zu Bindings, MVVM und der Kommunikation der Komponenten miteinander belesen. Du bist absolut überfordert mit dem Grundschema, was WPF und MVVM zugrunde liegt. Wenn dir Commands aktuell zu hoch sind kannst du auch erstmal anfangen nur im Code Behind zu arbeiten und alles in Events zu machen (OnClick usw.), dann wird das alles etwas einfacher und du hast auch direkten Zugriff auf deine UI-Elemente. Vlt ist das besser für dich. Dann kannst du auch textBox.Text = "Wilhelm" sagen und in einer Copy Methode ClipBoard.SetText(textBox.Text).

Ich denke du versuchst hier über deinen aktuellen Fähigkeiten zu arbeiten, und dann kann ich dir natürlich alles (im Kontext schon vorgekaut) liefern, aber wenn du das nicht verstehst und eigene Fehler im Code eigenständig erkennen kannst bringt das alles absolut gar nichts.
Daher Empfehlung: Schreib deine Applikation ohne Bindings, ohne ViewModel, ohne DataContext nur im Code Behind und gewöhne dich erstmal an Grundschemata und -abläufe. Wenn du dann irgendwann da sicher bist informierst du dich zu MVVM und lagerst schrittweise Daten und Funktionalität in ein ViewModel aus, um (das ist der Sinn eines ViewModels) deine UI von der Datenhaltung und -logik zu trennen/entkoppeln.
 
  • Gefällt mir
Reaktionen: toma123 und marcOcram
Danke für deine Worte, hab ich das richtig verstanden.
In der Code Behind Datei steht nichts weiter als der DataContext und die InitializeComponent() ?

Alles weitere (Methode zum ID ermitteln usw.) wird dann im ViewModel geschrieben?

Werde mich mal nochmals mit MVVM besser auseinandersetzen. Vlt. hast du ein wenig Lektüre (Buch, Video) wo es für Anfänger gut erklärt wird? Kann auch gern etwas kosten.
 
Beim MVVM ist verallgemeinert das Grundkonzept, dass (möglichst) die gesamte Datenlogik im ViewModel landet. Heißt Commands, Werte, Listen, etc. werden per Bindings definiert und im ViewModel implementiert. Die Verknüpfung kommt durch das Setzen des DataContexts.
Vorteil: wenn deine Datenlogik mal nutzlos wird weil sich irgendwo was ändert kannst du das mit einer Zeile austauschen und ein anderes nehmen, während deine UI bleibt wie sie ist. Anders herum kannst du deine UI austauschen, während die gesamte Logik im ViewModel unangetastet bleibt. Steht alles im Code Behind musst du da deutlich mehr anfassen.

Im Code Behind stehen dann eher Sachen, die spezifisch für diese UI sind und zum Beispiel UI-Funktionalitäten umsetzen, die aber mit den eigentlichen Daten nix zu tun haben. Bei mir bleiben sie in der Regel aber eher leer, bis auf den Konstruktor mit InitializeComponent und DataContext.

toma123 schrieb:
Vlt. hast du ein wenig Lektüre (Buch, Video) wo es für Anfänger gut erklärt wird?
Leider nicht. Halte persönlich auch nicht viel davon. Du findest in der Regel per Google oder auf StackOverflow.com fast immer Leute, die dein Problem schon mal hatten.
Anfangen kannst du aber sicher auf Seiten wie dieser hier. Die gehen Standardsachen auf einfacher Art und Weise durch und erklären die Grundlagen. Das sollte dir schon mal weiterhelfen :)
 
Hab das ganze nochmal umgestellt, meine Code Behind enthält jetzt nur:
C#:
 public MainWindow()
        {
            InitializeComponent();
            DataContext = new MainWindowViewModel();
        }

Außerdem habe ich jetzt mal zwei StackPanels in der XAML Datei erstellt und rufe lasse die Commandos über Hyperlink aufrufen.

XML:
<StackPanel Grid.Column="0" Grid.Row="0">
            <Label Content="ShowID" />
            <TextBlock>
                <Hyperlink Command="{Binding CopyCommand}">
                    <TextBlock Text="{Binding ShowIDText}" />
                </Hyperlink>
            </TextBlock>
        </StackPanel>

        <StackPanel Grid.Column="0" Grid.Row="1">
            <Label Content="Seriennummer" />
            <TextBlock>
                <Hyperlink Command="{Binding CopyCommand}" >
                    <TextBlock Text="{Binding SerialText}"/>
                </Hyperlink>
            </TextBlock>
        </StackPanel>

In der MainViewModel weise ich den beiden TextBoxen den Text folgendermaßen in der Init zu:
C#:
        string _showIDText;
        string _serialText;   
public string ShowIDText
        {
            get { return _showIDext; }
            set
            {
                _showIDText = value;
            }
        }
        public string SerialText
        {
            get { return _serialText; }
            set       
            {
                _serialText = value;
            }
    }

In der Copy Methode kopiert es jetzt zwar so wie gewollt, allerdings wird bei einem Klick alles kopiert und nicht nur das wo drauf geklickt wurde.
Code:
 private void Copy()
        {
            Clipboard.SetText(ShowIDText);
            Clipboard.SetText(SerialText);
        }

Wäre nett wenn mir da nochmals helfen würdest.
 
Keine Ahnung, ob Hyperlink das überhaupt unterstützt, aber CommandParameter ginge zum Beispiel, wenn man deine Command-Klasse erweitert.

C#:
<StackPanel Grid.Column="0" Grid.Row="0">
    <Label Content="ShowID" />
    <TextBlock>
        <Hyperlink Command="{Binding CopyCommand}" CommandParameter="{Binding ShowIDText}">
            <TextBlock Text="{Binding ShowIDText}" />
        </Hyperlink>
    </TextBlock>
</StackPanel>

<StackPanel Grid.Column="0" Grid.Row="1">
    <Label Content="Seriennummer" />
    <TextBlock>
        <Hyperlink Command="{Binding CopyCommand}" CommandParameter="{Binding SerialText}">
            <TextBlock Text="{Binding SerialText}"/>
        </Hyperlink>
    </TextBlock>
</StackPanel>

Ansonsten erzeuge ein zweites Command, dann hast du halt ein CopyIdCommand und ein CopySerialCommand.
 
Danke, jetzt funktioniert alles so wie ich es gern wollte. Danke auch für deine Geduld.
 
  • Gefällt mir
Reaktionen: Nero1
Welche Möglichkeiten habe ich einem Command mehrere Parameter zu übergeben? Natrülich sollte das ganze am Ende auch dem MVVM Pattern entsprechen.

XML:
<StackPanel Grid.Column="0" Grid.Row="4">
            <Label Content="ShowID" />
            <TextBlock>
                <Hyperlink Command="{Binding CopyCommand}" CommandParameter="{Binding ShowIDText}">
                    <TextBlock Text="{Binding ShowIDText}"/>
                </Hyperlink>
            </TextBlock>
        </StackPanel>

Ich würde nun noch gern den Label-Content als Parameter mit übergeben.
 
Zuletzt bearbeitet:
Zurück
Oben