2016-04-19 6 views
0

Ich möchte etwas Hilfe mit meinem Testprojekt. Ich möchte, wenn ich eine meiner Tasten drücke und der Buchstabe in dem versteckten Wort in der Textbox (Henker) besteht, um die Textbox mit den aufgedeckten Buchstaben zu aktualisieren. Momentan funktioniert meine Logik beim Raten aber die Textbox wird nicht aktualisiert.C# wpf MVVM Textbox Update

MainWindow.xaml: 
<Window x:Class="test.MainWindow" 
    xmlns:vm="clr-namespace:test.ViewModel" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 

<Window.DataContext> 
    <vm:MainWindowViewModel /> 
</Window.DataContext> 

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="59*"/> 
     <RowDefinition Height="55*"/> 
     <RowDefinition Height="68*"/> 
     <RowDefinition Height="65*"/> 
     <RowDefinition Height="72*"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="13*"/> 
     <ColumnDefinition Width="34*"/> 
    </Grid.ColumnDefinitions> 
    <Button Grid.Column="0" Grid.Row="0" Command="{Binding ButtonClick}" CommandParameter="a"> 
     a 
    </Button> 
    <Button Grid.Column="0" Grid.Row="1" Command="{Binding ButtonClick}" CommandParameter="b"> 
     b 
    </Button> 
    <Button Grid.Column="0" Grid.Row="2" Command="{Binding ButtonClick}" CommandParameter="c"> 
     c 
    </Button> 
    <Button Grid.Column="0" Grid.Row="3" Command="{Binding ButtonClick}" CommandParameter="d"> 
     d 
    </Button> 
    <Button Grid.Column="0" Grid.Row="4" Command="{Binding ButtonClick}" CommandParameter="e"> 
     e 
    </Button> 
    <TextBox Text="{Binding Path=DisplayWordInTextbox, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" Grid.Row="2"/> 
</Grid> 

MainWindowViewModel.cs:

class MainWindowViewModel : INotifyPropertyChanged 
{ 
    private string displayWordInTextbox; 
    public string DisplayWordInTextbox 
    { 
     get 
     { 
      return displayWordInTextbox; 
     } 
     set 
     { 
      displayWordInTextbox = value; 
      NotifyPropertyChanged("DisplayWordInTextbox"); 
     } 
    } 

    public MainWindowViewModel() 
    { 
     buttonClick = new RelayCommand(buttonFunction); 
     loadWordsFromFile(); 
     selectWord(); 
     displayWord(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName] String propName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 
} 
+0

Haben Sie Bindung Fehler haben, pls das Ausgabefenster des Visual Studio überprüfen, Alles scheint für mich – Eldho

+0

========== Build-in Ordnung zu sein: 1 gelang, 0 fehlgeschlagen , 0 up-to-date, 0 übersprungen ========== – tony

+0

nicht dies, während das Projekt ausgeführt wird, wenn es einen verbindlichen Fehler gibt es in Ausgabe – Eldho

Antwort

2

Sie den privaten Bereich "displayWordInTextbox" anstelle der binded-Eigenschaft " DisplayWordInTextbox ", damit NotifyPropertyChanged nicht ausgelöst wird.

Ersetzen Sie "displayWordInTextbox" mit "DisplayWordInTextbox" innerhalb der DisplayWord-Funktion und sollte funktionieren.

private void displayWord() 
{ 
    DisplayWordInTextbox = ""; 
    for (int i = 0; i < copyCurrentWord.Length; i++) 
    { 
     DisplayWordInTextbox += copyCurrentWord.Substring(i, 1); 
     DisplayWordInTextbox += " "; 
    } 
} 
+0

danke !!! Es funktioniert jetzt :) – tony

0

hier ist meine ganze MainWindowViewModel:

using System; 
using System.ComponentModel; 
using System.IO; 
using System.Linq; 
using System.Runtime.CompilerServices; 
using System.Windows.Input; 

namespace test.ViewModel 
{ 
class MainWindowViewModel : INotifyPropertyChanged 
{ 
    private string[] words; 
    private string currentWord; 
    private string copyCurrentWord; 

    private string displayWordInTextbox; 
    public string DisplayWordInTextbox 
    { 
     get 
     { 
      return displayWordInTextbox; 
     } 
     set 
     { 
      displayWordInTextbox = value; 
      NotifyPropertyChanged("DisplayWordInTextbox"); 
     } 
    } 

    public MainWindowViewModel() 
    { 
     buttonClick = new RelayCommand(buttonFunction); 
     loadWordsFromFile(); 
     selectWord(); 
     displayWord(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName] String propName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 

    private ICommand buttonClick; 
    public ICommand ButtonClick 
    { 
     get 
     { 
      return buttonClick; 
     } 
     set 
     { 
      buttonClick = value; 
     } 
    } 

    void buttonFunction(object obj) 
    { 
     string buttonContent = obj.ToString(); 
     if (currentWord.Contains(buttonContent) || currentWord.Contains(buttonContent.ToUpper())) 
     { 
      char[] temp = copyCurrentWord.ToCharArray(); 
      char[] findWord = currentWord.ToCharArray(); 
      char guessChar = buttonContent.ElementAt(0); 
      for (int i = 0; i < findWord.Length; i++) 
      { 
       if (findWord[i] == guessChar || findWord[i] == Char.ToUpper(guessChar)) 
       { 
        temp[i] = findWord[i]; 
       } 

      } 
      copyCurrentWord = new string(temp); 
      displayWord(); 
     } 
    } 

    private void loadWordsFromFile() 
    { 
     words = new string [] {"cat", "dog"}; 
    } 

    private void selectWord() 
    { 
     int randomWordIndex = (new Random()).Next(words.Length); 
     currentWord = words[randomWordIndex]; 
     char[] currentWordArray = currentWord.ToArray(); 
     bool isWord = false; 

     for (int i = 0; i < currentWord.Length; i++) 
     { 
      for (char c = 'a'; c <= 'z'; c++) 
      { 
       if (currentWordArray[i] == c || currentWordArray[i] ==  Char.ToUpper(c)) 
       { 
        isWord = true; 
       } 
      } 
      if (isWord == true) 
      { 
       copyCurrentWord += "_"; 
       isWord = false; 
      } 
      else 
      { 
       copyCurrentWord += currentWordArray[i]; 
      } 
     } 
     words = words.Where(w => w != words[randomWordIndex]).ToArray(); 
    } 

    private void displayWord() 
    { 
     displayWordInTextbox = ""; 
     for (int i = 0; i < copyCurrentWord.Length; i++) 
     { 
      displayWordInTextbox += copyCurrentWord.Substring(i, 1); 
      displayWordInTextbox += " "; 
     } 
    } 
    } 
}