我有以下代码;
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
bool _myValue;
public bool myValue
{
get { return _myValue; }
set {
_myValue = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("myValue"));
}
}
public MainWindow() {
myValue = false;
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += timer_Tick;
timer.Start();
}
void timer_Tick(object sender, EventArgs e) {
myValue = !myValue;
lblTime.Content = myValue.ToString();
}
}
和相应的 XAML:
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis" />
</Window.Resources>
<DockPanel Margin="10">
<Button x:Name="HideMe"
Height="50" Width="50"
Cursor="Hand"
Visibility="{Binding Path=myValue, Converter={StaticResource BoolToVis}}"/>
<Label x:Name="lblTime" />
</DockPanel>
我正在尝试做的是; 是每次timer_tick更新按钮的可见性; 标签已更新,但绑定拒绝工作
我非常确定存在疏忽,但是在遵循了大量教程之后,没有关于如何使它工作的内容..大多数使用WPF上的复选框;但是我需要发送代码隐藏中的布尔值来控制按钮的可见性,一旦它被更新。
将窗口的DataContext
设置为自身,不要忘记调用InitializeComponent()
:
public MainWindow()
{
InitializeComponent();
DataContext = this; //<--
myValue = false;
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += timer_Tick;
timer.Start();
}
mm8 为您的问题提供了完美的答案(设置数据上下文( - 我只想指出一件小事,在建造房产时应该会让你的生活更轻松。
我们可以创建一个函数来触发属性更改事件,要求你只写"OnPropertyChanged(("来触发UI更新。为此,我们将在下面添加"void",告诉它默认使用名为"调用方成员名称"的属性,除非您手动提供属性名称(即 OnPropertyChanged("SomeOtherValue"(;)。
为此,我们首先需要在 UserViewModel 类的顶部添加一个 using 语句:
using System.Runtime.CompilerServices;
然后,我们将添加 OnPropertyChanged 代码并包含"调用方成员名称"它应该看起来像这样:
private void OnPropertyChanged([CallerMemberName] String name = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
现在 - 我们将更新您的属性以使用简化的方法:
public bool myValue
{
get { return _myValue; }
set
{
_myValue = value;
OnPropertyChanged();
}
}
最后 - 我个人更喜欢简化的获取/设置方式 - 你正在做的事情是完全可以的,如果你不想改变它,也没有必要改变它,但我建议尝试这种方式,看看你喜欢它:)
public bool MyValue
{
get => _myValue;
set
{
// If the value hasn't changed, the code will return (Exit) - avoiding a false property changed trigger :)
if (_myValue == value) return;
_myValue = value;
OnPropertyChanged();
}
}
原因:检查 SET 中的值是否实际更改将防止错误触发器,您使用更少的括号,并且 intellisense 使编写变得超级容易!
如果您有任何问题,请告诉我!