我正在尝试使用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上设置了一个断点,那么如果我选中或取消选中该框,调试器就会中断。
感谢您的帮助。
乔恩
答案 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>