将 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 中使用 ElementName
和 Path
。所以我尝试了以下方法:
<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 方法而不是代码隐藏。
我有一个 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 中使用 ElementName
和 Path
。所以我尝试了以下方法:
<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 方法而不是代码隐藏。