簡體   English   中英

將類級布爾值綁定到WPF“IsChecked”屬性

[英]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中使用了ElementNamePath 所以我嘗試了以下方法:

                <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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM