TextBlock绑定不起作用

时间:2014-05-07 14:30:36

标签: c# wpf data-binding mvvm

我想创建一个简单的WPF应用程序,它在视图中包含一个Button和一个TextBlock。我想,当我点击按钮时,写下你好"到TextBlock。

这是我的观点:

<Window x:Class="PropertyTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
    <Button Name="ButtonIncreaser" Content="Button"  Command="{Binding CalculateCommand}" CommandParameter="+" HorizontalAlignment="Left" Height="23" Margin="400,206,0,0" VerticalAlignment="Top" Width="75"/>
    <TextBlock Name="TextB" HorizontalAlignment="Left" Height="23" Margin="56,206,0,0" TextWrapping="Wrap" Text="{Binding Szoveg,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="292"/>
    </Grid>
</Window>

这是MainWindow.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        ViewModel m = new ViewModel();
        this.DataContext = m;
        this.Show();
    }
}

这就是我的观点模型:

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public DelegateCommand CalculateCommand { get; private set; }
    public ViewModel()
    {
        CalculateCommand = new DelegateCommand(param => Calculate(param.ToString()));
    }

    public void Calculate(string param)
    {
        _str = "Hello";
    }

    private string _str;
    private string Szoveg
    {
        get
        {
            return _str;
        }
        set
        {
            _str = value;
            OnPropertyChanged("Szoveg");
        }
    }


    public void OnPropertyChanged(String name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        } 
    }
}

我做错了什么?谢谢!

1 个答案:

答案 0 :(得分:3)

Calculate功能中,您需要直接设置您的私人数据成员_str。这并不会导致OnPropertyChanged函数被调用,表示Szoveg的值已更改。

只需将该行更改为

即可
Szoveg = "Hello" 

你应该好。

正如XAMIMAX在评论中指出的那样,您需要将Szoveg属性更改为public属性 - per MSDN

  

您用作绑定的绑定源属性的属性必须   是你班级的公共财产。明确定义的接口   无法访问属性用于绑定目的,也不能保护,   没有基础的私有,内部或虚拟属性   实施

此外,您并不真正需要绑定的UpdateSourceTrigger=PropertyChanged部分 - 这在用于编辑{{1}内容的TextBox的某些情况下是有意义的}。但对于TextBlock而言,它并没有真正有意义,在绝大多数情况下都没有必要。