我想帮助我的测试项目。当我按下我的一个按钮时,我喜欢这个字母在文本框(hangman)中隐藏的单词,用更新的字母更新文本框。目前我的猜测逻辑有效,但文本框不会更新。
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 :(得分:2)
您正在设置私有字段“displayWordInTextbox”而不是绑定属性“DisplayWordInTextbox”,因此不会触发NotifyPropertyChanged。
将“displayWordInTextbox”替换为displayWord函数内的“DisplayWordInTextbox”,应该可以正常工作。
private void displayWord()
{
DisplayWordInTextbox = "";
for (int i = 0; i < copyCurrentWord.Length; i++)
{
DisplayWordInTextbox += copyCurrentWord.Substring(i, 1);
DisplayWordInTextbox += " ";
}
}
答案 1 :(得分:0)
这是我的整个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 += " ";
}
}
}
}