我想根据事件更改值(textBlock)。然后,我想刷新我的窗户,但我不能。我使用了invalidateVisual以及其他帖子的解决方案,但没有任何效果。
提前谢谢
答案 0 :(得分:3)
有几种解决方案(第一种和第二种解决方案不使用数据绑定)。
txtMyControl.text = "New value";
如果不在主线程上,您可以使用调度程序更新值。
Application.Current.Dispatcher.BeginInvoke(() => txtMyControl.text == "New Value")
但是,WPF最友好的方法是使用数据绑定。 对代码中的值所做的任何更改都将立即反映在UI中。
XAML
<TextBox x:Name="txtExample" Text="{Binding MyTextProperty,Mode=TwoWay}" Height="24" Width="120"/>
在您的代码中,您必须声明一个持久的变量。
private ExampleModel _ExampleModel = new ExmampleModel();
加载代码时,将该变量与文本框数据上下文相关联。
txtExample.DataContext = _ExampleModel
然后,您将拥有包含屏幕上所有可编辑属性的类(文本框,单选框等等)
public class ExampleModel : INotifyPropertyChanged
{
private string _MyTextProperty = "test";
public string MyTextProperty {
get { return _MyTextProperty; }
set {
if (string.Compare(_MyTextProperty, value) != 0) {
_MyTextProperty = value;
RaisePropertyChanged("MyTextProperty");
}
}
}
public void RaisePropertyChanged(string PropertyName)
{
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
}
}
public event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged;
public delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e);
}
每当您处理事件时,您只需更改包含信息的属性的值,UI将相应地刷新。此外,由于我们使用双向绑定,因此文本框中的值将始终与ExampleModel类中MyTextProperty属性所包含的值相同,这使得值检索非常容易。 例如:
_ExampleModel.MyTextProperty = "New value";
如果您已经在使用数据绑定,请确保使用的类实现了INotifyPropertyChanged,并且在属性值更改时调用了propertyChanged事件,否则它将不会更新UI。
答案 1 :(得分:0)
您尝试做的最佳方法是使用数据绑定。
您需要一个始终保存文本块值的字符串对象。接下来,您需要将该对象绑定到文本块,然后使用INotifyPropertyChanged
接口提供的事件,每次值更改其表示(文本块)将更改为,无需刷新窗口。
更多信息here
答案 2 :(得分:0)
如果您的事件更新了文本块,并且您正在使用的文本块绑定到字符串属性,并且该属性在其set方法中发出NotifyPropertyChanged(),则会导致显示按需要刷新。 / p>
还有其他方法,但鉴于我对你的问题的理解,这是最简单的方法。
(这与其他答案类似,但我试图说出来,因此更容易理解/实施。)