使用 CodeBehind 布尔值更新控件的可见性



我有以下代码;

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 使编写变得超级容易!

如果您有任何问题,请告诉我!

相关内容

  • 没有找到相关文章