2015-03-03 2 views
0

У меня есть приложение WPF VB.NET, которое работает в двух разных режимах (режим разработки и режим оценки соответственно). Я добавил пункт меню и кнопку переключения, чтобы пользователь мог выбрать, какой режим он/она использует с легкостью. Конечно, все приложение действует по-разному в зависимости от того, находится ли он в режиме разработки или нет, поэтому имеет смысл создать логический уровень класса, представляющий работу в режиме проектирования, и привязать к ним эти свойства IsChecked.Привязать булевский уровень класса к объекту 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> 

Это тоже не сработало. Я сделал больше исследований и нашел некоторых людей, использующих ElementName и Path в своем XAML. Поэтому я пробовал следующее:

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

Это тоже не сработало. Я также видел, как некоторые люди использовали пользовательские конвертеры, но они мало объясняли, что делает конвертер (конвертация с C# на VB там тоже не помогла).

Короче говоря, может кто-то, пожалуйста, помогите мне настроить привязку свойств этих элементов управления к логическим уровням класса и объяснить, почему и как на этом пути?

ответ

0

См. Приведенный ниже код.

<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 подход, а не код позади.

+0

Спасибо за помощь. Я снова посмотрел на реализацию MVVM и узнал больше об этом методах. В этом контексте данные, связывающие эти свойства, имеют больший смысл. –

+0

Я начал читать ваш код еще больше, так что я мог бы реализовать его где-то еще, и у меня еще два вопроса. 1 - Каков синтаксис для 'RelativeSource' в XAML? 2 - Я предполагаю, что код для создания нового события - это то, что окно может обновлять его содержимое при изменении свойства; это правильно, хотя в окне нет кода в XAML или VB, который делает это? –

+0

Предлагаю вам перейти через Data Binding в WPF, который ответит на все ваши вопросы. https://msdn.microsoft.com/en-us/library/ms750612(v=vs.110).aspx. –

Смежные вопросы