将 class 级布尔值绑定到 WPF "IsChecked" 属性

Bind a class-level boolean to WPF "IsChecked" property

我有一个 VB.NET WPF 应用程序,它以两种不同的模式(分别是设计模式和评估模式)运行。我添加了一个菜单选项和切换按钮,以便用户可以轻松选择 s/he 使用的模式。当然,整个应用程序的行为也取决于它是否处于设计模式,因此创建一个 class 级别的布尔值来表示在设计模式下工作并绑定这些项目是有意义的 IsChecked 属性 到它。

起初,我尝试在代码隐藏中添加绑定,如下所示:

Class MainWindow
    Private IsInDesignMode As Boolean = True

    Private Sub Window_Loaded(sender as Object, e as RoutedEventArgs)
        SetUpDataBindings()
    End Sub

    Private Sub SetUpDataBindings()
        tglDesignMode.IsChecked = New Binding(IsInDesignMode)
        mnuDesignMode.IsChecked = New Binding(IsInDesignMode)
    End Sub
End Class

然后我读到控件只能绑定到属性,我读到的所有示例都显示了 public 属性,所以我将上面的第 2 行更改为:

Public Property IsInDesignMode as Boolean = True

但是在这两种情况下,启动时都没有检查按钮和菜单,并且没有保持 checked/unchecked 在一起。所以我尝试了一种不同的策略,使用 XAML:

                <ToggleButton Name="tbnDesignMode"
                              IsChecked="{Binding IsInDesignMode}">
                    DESIGN MODE
                </ToggleButton>

那也没用。我做了更多研究,发现有些人在他们的 XAML 中使用 ElementNamePath。所以我尝试了以下方法:

                <MenuItem Name="mnuDesignMode"
                          Header="_Design Mode"
                          IsCheckable="True"
                          IsChecked="{Binding ElementName=mnuDesignMode, Path=IsInDesignMode}"/>

那也没用。我还看到一些人使用自定义转换器,但他们并没有过多解释转换器的功能(从 C# 到 VB 的转换也无济于事)。

长话短说,谁能帮我设置一个从这些控件的 IsChecked 属性到 class 级布尔值的绑定,并解释为什么以及如何进行?

参考下面的代码。

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<StackPanel>
    <ToggleButton Name="tbnDesignMode"
                          IsChecked="{Binding Path=IsInDesignMode,
                      RelativeSource={RelativeSource Mode=FindAncestor,
                                                     AncestorType=Window}}">
        DESIGN MODE
    </ToggleButton>
    <MenuItem Name="mnuDesignMode"
                      Header="_Design Mode"
                      IsCheckable="True"
                      IsChecked="{Binding Path=IsInDesignMode,
                      RelativeSource={RelativeSource Mode=FindAncestor,
                                                     AncestorType=Window}}"/>
</StackPanel>

Imports System.ComponentModel

Class MainWindow
    Implements INotifyPropertyChanged
    Private isInDesignModeValue As Boolean
    Public Property IsInDesignMode() As Boolean
        Get
            Return isInDesignModeValue
        End Get
        Set(ByVal value As Boolean)
            isInDesignModeValue = value
            OnPropertyChanged1("IsInDesignMode")
        End Set
    End Property


    Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
        IsInDesignMode = True
    End Sub


    Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged



    Protected Sub OnPropertyChanged1(ByVal name As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name))
    End Sub

End Class

但我建议您寻找 MVVM 方法而不是代码隐藏。