[英]c# wpf MVVM textbox update
我需要测试项目的帮助。 我想按一下其中一个按钮,然后该字母包含在文本框(hang子手)中的隐藏单词中,以使用显示的字母更新文本框。 目前,我的逻辑与猜测有关,但文本框不会更新。
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));
}
}
}
您正在设置私有字段“ displayWordInTextbox”,而不是绑定属性“ DisplayWordInTextbox”,因此不会触发NotifyPropertyChanged。
在displayWord函数中,将“ displayWordInTextbox”替换为“ DisplayWordInTextbox”,即可正常工作。
private void displayWord()
{
DisplayWordInTextbox = "";
for (int i = 0; i < copyCurrentWord.Length; i++)
{
DisplayWordInTextbox += copyCurrentWord.Substring(i, 1);
DisplayWordInTextbox += " ";
}
}
这是我的整个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 += " ";
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.