[英]Bind a class-level boolean to WPF “IsChecked” property
我有一個VB.NET WPF應用程序,它以兩種不同的模式運行(分別是設計模式和評估模式)。 我添加了一個菜單選項和切換按鈕,以便用戶可以輕松選擇他/她正在使用的模式。 當然,整個應用程序的行為也取決於它是否處於設計模式,因此創建一個類級布爾來表示在設計模式下工作是有意義的,並將這些項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
然后我讀到控件只能綁定到屬性,我讀到的所有示例都顯示了公共屬性,所以我將上面的第2行更改為:
Public Property IsInDesignMode as Boolean = True
但是在這兩種情況下,啟動時都沒有檢查按鈕和菜單,並且沒有一起檢查/取消選中。 所以我嘗試了一種不同的策略,使用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
屬性綁定到類級布爾值的綁定,並解釋為什么以及如何沿途?
請參閱以下代碼。
<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方法而不是代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.