绑定CheckBox IsChecked到Stackpanel可见性

时间:2016-06-06 18:56:28

标签: wpf vb.net checkbox mvvm data-binding

我正在尝试使用MVVM将堆栈面板中某些文本框的Visibility属性绑定到WPF中复选框的IsChecked属性。为此,我创建了一个属性 IsBoxChecked 作为布尔值,其中包含文本框和和复选框绑定的私有支持字段 _isBoxChecked 。当我运行该程序时,无论我将属性初始化为什么值,具有绑定Visibility属性的文本框都会自动折叠。此外,如果我在构造函数中将属性初始化为true,则不会显示复选框。这是代码。

        <StackPanel Grid.Column="0" 
                Margin="10,37" 
                HorizontalAlignment="Right" 
                VerticalAlignment="Top">
        <TextBlock Text="Always Visible" Margin="5"/>
        <TextBlock Text="Also Always Visible" Margin="5"/>
        <TextBlock Text="Needs to Hide and Unhide" Margin="5" Visibility="{Binding IsBoxChecked, Converter={StaticResource BoolToVis}}"/>
        <CheckBox Content="Text" IsChecked="{Binding IsBoxChecked, Mode=TwoWay}" Margin="5"/>

    </StackPanel>

这是我的ViewModel。

Public Class NewSpringViewModel
Implements INotifyPropertyChanged

Private _newWindow As NewView
Private _isBoxChecked As Boolean

Public Sub New()

    _newWindow = New NewView
    _newWindow.DataContext = Me
    _newWindow.Show()

    IsBoxChecked = True

End Sub

Public Property IsBoxChecked As Boolean
    Get
        Return _isBoxChecked
    End Get
    Set(value As Boolean)
        _isBoxChecked = value
        OnPropertyChanged("IsBoxChecked")
    End Set
End Property

Private Sub OnPropertyChanged(PropertyName As String)
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("PropertyName"))
End Sub

Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
End Class

绑定到该属性的复选框正常运行。如果我在IsBox Checked属性的setter上设置了一个断点,那么如果我选中或取消选中该框,调试器就会中断。

感谢您的帮助。

乔恩

1 个答案:

答案 0 :(得分:0)

不确定VB语法,但不应该这个

RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("PropertyName"))

改为

RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(PropertyName))

这将解释为什么没有通知。传递参数而不是常量字符串

你也可以直接将TextBlock Visibility绑定到IsChecked属性(通过ElementName引用CheckBox)

<StackPanel Grid.Column="0" 
        Margin="10,37" 
        HorizontalAlignment="Right" 
        VerticalAlignment="Top">
    <TextBlock Text="Always Visible" Margin="5"/>
    <TextBlock Text="Also Always Visible" Margin="5"/>
    <TextBlock Text="Needs to Hide and Unhide" Margin="5" 
               Visibility="{Binding IsChecked, ElementName=chk, Converter={StaticResource BoolToVis}}"/>
    <CheckBox Content="Text" Name="chk" Margin="5"/>
</StackPanel>