为什么我看不到“Visible”属性的绑定?

Why don't I see the binding of my "Visible" property?

提问人:Dominique 提问时间:11/16/2023 最后编辑:Dominique 更新时间:11/16/2023 访问量:58

问:

我正在尝试修改 XAML 中 a 的可见性。我这样做如下:CheckBox

XAML 摘录:

<CheckBox Content="RES" 
          IsChecked="{Binding Unit.Reserved}" 
          Name="chk_Reserved" 
          Visibility="{Binding Res_Visible}"
          ToolTip="Gereserveerd">
</CheckBox>

...但是,在调试时,如果我转到“实时可视化树”,我会在属性列表中看到以下内容:

Live Visual Tree screenshot

如您所见,属性有一个绑定表达式,但该属性没有绑定表达式,尽管这是 XAML 所期望的。IsCheckedVisible

有谁知道这是怎么回事?(属性不是“可绑定的”,...Visible

在第一次评论后编辑: 特此介绍属性的定义:
Res_Visible

public class CassetteLevelViewModel:BaseViewModel
{
    ...        
    public Visibility Res_Visible { get; set; }
    ...

似乎是一个.这是正确的吗?(我以为还有一个,还是我错了?VisibilitySystem.Windows.VisibilityUIElement.Visibility

提前致谢

C# WPF XAML 绑定

评论

1赞 kipy 11/16/2023
Res_Visible的类型是什么?如果它是布尔值,则必须使用 Converter 来匹配可见性枚举。
1赞 Jon Skeet 11/16/2023
Visible绝对是可绑定的。它真的对你有用吗?是否在输出中看到任何绑定错误?你能提供一个最小的可重复的例子吗?(这里缺少大量的上下文。请不仅在此处提供更多背景信息,而且在以后的问题中提供更多信息。
0赞 Dominique 11/16/2023
@kipy:我添加了 .对不起,我在写问题时忘记了这一点。Res_Visible
0赞 kipy 11/16/2023
该枚举确实是 System.Windows.Visibility 的枚举。绑定不起作用吗?

答:

1赞 i3070-inline 11/16/2023 #1

我希望我正确地理解了这个问题,您与该属性进行了绑定,我怀疑您想更改可见性,但是当您从中更改它时,它不起作用。Res_VisibleCassetteLevelViewModel

要通知 (Xaml) 在您的案例中为 () 的属性已更改值,您应该在 .ViewViewModelCassetteLevelViewModelINotifyPropertyChangedBaseViewModel

如果您不使用 ,您可以在下面找到您应该添加的内容。BaseViewModel

public class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

该方法通知 View 属性值已更改。OnPropertyChanged()

如果已使用,则只需修改属性,如下例所示。

private Visibility _res_Visibile;
public Visibility Res_Visibile
    {
        get => _res_Visibile;
        set
        {
            _res_Visibile = value;
            OnPropertyChanged();
        }
    }

评论

0赞 Dominique 11/16/2023
谢谢。这看起来是一个很好的方法,但与此同时,我已经找到了解决方案。我在回答中提到了它。
0赞 i3070-inline 11/16/2023
我以为你知道枚举的默认值是.Visibility Visibility.Visible
0赞 Dominique 11/16/2023
不,对不起,我不知道。
-1赞 Dominique 11/16/2023 #2

经过相当多的实验,我在属性的定义中找到了解决方案: 我更改了:

public Visibility Res_Vis {get;set;}

到:

public Visibility Res_Vis {get;set;} = Visibility.Hidden;

现在一切正常。