c#wpf MVVM文本框更新

时间:2016-04-19 12:14:07

标签: c# wpf xaml mvvm

我想帮助我的测试项目。当我按下我的一个按钮时,我喜欢这个字母在文本框(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));
        }
    }
}

2 个答案:

答案 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 += " ";
        }
    }
  }
}