将数据从属性绑定到文本块 - MVVM Light和WPF

时间:2013-11-10 10:40:23

标签: c# wpf xaml mvvm mvvm-light

我在WPF中有一个文本块,它绑定到我的ViewModel类中的属性。单击按钮我希望修改属性并期望在我的文本块中反映出来。我希望所有这些都是纯粹使用MVVM(MVVMLight)完成的。我正在使用MMVM灯和VS 2012。 挑战 - 在按钮上单击更改未反映。虽然程序执行是在属性内进行的,但是没有进行更改。

请帮助!!

计划 - 视图:

<Window x:Class="MvvmLight1_Trail.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:ignore="http://www.ignore.com"
    mc:Ignorable="d ignore"
    Height="500"
    Width="500"
    Title="MVVM Light Application"
    DataContext="{Binding Main, Source={StaticResource Locator}}">



<Grid x:Name="LayoutRoot">


    <TextBlock FontSize="34"
               Text="{Binding Path=MyText,UpdateSourceTrigger=Default, Mode=TwoWay}"
               VerticalAlignment="Center"
               HorizontalAlignment="Center"
               TextWrapping="Wrap" />
    <Button Width="100" Height="100" Command="{Binding PressCommand}" Margin="198.985,277.537,193.014,92.462" Content="Press Me"/>

</Grid>

查看模型

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using MvvmLight1_Trail.Model;
using System.ComponentModel;
using System.Threading;

namespace MvvmLight1_Trail.ViewModel
{

public class MainViewModel : ViewModelBase
{



    public RelayCommand PressCommand { get; private set; }
    Thread t;
    private string _welcomeTitle = string.Empty;


    public string MyText
    {
        get
        {
            return _welcomeTitle;
        }

        set
        {
            if (_welcomeTitle == value)
            {
                return;
            }

            _welcomeTitle = value;
            RaisePropertyChanged(MyText);
        }
    }

    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel()
    {
        PressCommand = new RelayCommand(() => MyFunc());
        myfunc();
    }

    private void MyFunc()
    {
        this.MyText = "Hi2";
    }

    private void myfunc()
    {

        this.MyText = "Hello";
        this.MyText = "Hi";

    }
}
}

3 个答案:

答案 0 :(得分:7)

替换

RaisePropertyChanged(MyText);

RaisePropertyChanged("MyText");

应该在属性名称上引发PropertyChanged事件,而不是在属性值上引发。

答案 1 :(得分:4)

@Rohit Vats已经回答了。您也可以调用RaisePropertyChanged,RaisePropertyChanged( () => MyText)以便以后重命名。

答案 2 :(得分:1)

比赛结束但是:

在新的C#6中你也可以使用这样的名字:

RaisePropertyChanged(nameof(MyText))