我想创建一个简单的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));
}
}
}
我做错了什么?谢谢!
答案 0 :(得分:3)
在Calculate
功能中,您需要直接设置您的私人数据成员_str
。这并不会导致OnPropertyChanged
函数被调用,表示Szoveg
的值已更改。
只需将该行更改为
即可Szoveg = "Hello"
你应该好。
正如XAMIMAX在评论中指出的那样,您需要将Szoveg
属性更改为public
属性 - per MSDN:
您用作绑定的绑定源属性的属性必须 是你班级的公共财产。明确定义的接口 无法访问属性用于绑定目的,也不能保护, 没有基础的私有,内部或虚拟属性 实施
此外,您并不真正需要绑定的UpdateSourceTrigger=PropertyChanged
部分 - 这在用于编辑{{1}内容的TextBox
的某些情况下是有意义的}。但对于TextBlock而言,它并没有真正有意义,在绝大多数情况下都没有必要。