gpt4 book ai didi

c# - 如何有条件地隐藏部分 WPF 控件?

转载 作者:行者123 更新时间:2023-12-03 10:23:45 27 4
gpt4 key购买 nike

我在程序集中有一个无法更改的控件,它与 .NET DateTimePicker 非常相似.我想在满足某个条件时隐藏该控件的时间选择器部分(我的 ViewModel 上的属性值)。控件如下所示:

[TemplatePart(Name = "PART_DatePicker", Type = typeof (DatePicker))]
[TemplatePart(Name = "PART_TimePicker", Type = typeof (TimePicker))]
public class MyDateTimePicker : Control {/*...*/}

这个答案显示了一种总是隐藏控件的一部分的好方法,但我想动态地做到这一点:

How to hide a part of a WPF control

我想有几种方法可以做到这一点。我想要的是最小的东西(比如链接问题的答案)以及不违反 MVVM 的东西。 System.Interactivity行为和触发器是公平的游戏。

最佳答案

创建一个扩展前一个控件的新控件

public sealed class MySuperiorDateTimePicker : MyDateTimePicker 
{
//....

添加一个可以绑定(bind)到 ViewModel 状态的 DependencyProperty
public static readonly DependencyProperty HideItProperty =
DependencyProperty.Register(
"HideIt",
typeof(bool),
typeof(MySuperiorDateTimePicker ),
new UIPropertyMetadata(false, HideItPropertyChanged));
//snip property impl

等待属性改变,然后隐藏你的 UI
private static void HideItPropertyChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
(d as MySuperiorDateTimePicker).OnHideItChanged((bool)e.OldValue,
(bool)e.NewValue);
}

private void OnHideItChanged(bool oldValue, bool newValue)
{
if(BusyTemplate == null)
return;
FindTimePicker().Visibility = newValue ? Visibility.Visible :
Visibility.Collapsed;
}

private UIElement FindTimePicker()
{
//snip null checks
return GetTemplateChild("PART_TimePicker") as UIElement;
}

小心 FindTimePicker因为您的 DP 可能会在加载控件之前更改,并且 GetTemplateChild将返回空值。通常要做的事情是,在 OnHideItChanged , 如果 GetTemplateChild返回 null 使用 Dispatcher.BeginInvoke稍后重新运行事件处理程序( ApplicationIdle 或更早)。

当你发现自己在说“我如何使用 MVVM 完成 UI 工作”时,停下来重新思考你的真正目标。 MVVM != 没有代码隐藏,没有自定义控件等。

关于c# - 如何有条件地隐藏部分 WPF 控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14508360/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com