【问题标题】:Bind checkbox.ischecked to boolean property?将 checkbox.ischecked 绑定到布尔属性?
【发布时间】:2018-06-19 20:16:48
【问题描述】:

比我聪明的人帮助完成一个简单的编码任务:将复选框的 .ischecked 绑定到对象的布尔属性?我创建了一个简单的项目来模仿我在一个更大的项目中尝试做的事情,以进行简单的调试和演示。我有一个复选框,单击它会设置我的类对象的布尔属性。 UI 上的另一个复选框应根据该布尔属性的 T/F 值更新其选中状态。这里有什么问题以及如何修复并使其正常工作?我“相信”问题可能是因为我设置的对象的属性与 checkbox.ischecked 属性绑定的对象不同(???)。这是问题所在,如果是,我该如何解决? VB 或 XAML 端需要实现哪些代码?

MainWindow.xaml.vb

Public Bools As New Boolean_Properties

Private Sub ckbx1_Click(sender As Object, e As RoutedEventArgs) Handles ckbx1.Click
    If ckbx1.IsChecked Then
        Bools.Sta1Mode = True
    Else Bools.Sta1Mode = False
    End If
End Sub

类 Boolean_Properties

Implements INotifyPropertyChanged
Private ModeSta1 As Boolean
Public Event ThePropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

Property Sta1Mode As Boolean
    Get
        Return ModeSta1
    End Get
    Set(ByVal value As Boolean)
        ModeSta1 = value
        RaiseEvent ThePropertyChanged(Me, New PropertyChangedEventArgs("Sta1Mode"))
    End Set
End Property

XAML

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:BindBooleanProperty"
    mc:Ignorable="d"
    xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
    Title="MainWindow" Height="217.032" Width="226.067">
<Window.DataContext>
    <local:Boolean_Properties/>
</Window.DataContext>
<Grid>
    <CheckBox Content="Output" HorizontalAlignment="Left" Margin="99.866,134.399,0,0" VerticalAlignment="Top" IsChecked="{Binding Sta1Mode, Mode=OneWay}">
        <CheckBox.DataContext>
            <local:Boolean_Properties/>
        </CheckBox.DataContext>
    </CheckBox>
    <CheckBox x:Name="ckbx1" Content=" Input" HorizontalAlignment="Left" Margin="99.866,78.932,0,0" VerticalAlignment="Top"/>

</Grid>

【问题讨论】:

  • Public Event ThePropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChange 看起来很可疑。该事件应该被称为PropertyChanged。你试过没有别名吗?
  • ??我不就是这样吗? "公共事件 ThePropertyChanged 作为 PropertyChangedEventHandler 实现 INotifyPropertyChanged.PropertyChanged"

标签: c# vb.net xaml


【解决方案1】:

您可以使用 WPF 数据绑定:
无需使用if 更改它,只需绑定 XAML 接口并更改类的属性即可。

Imports System.ComponentModel

Public Class Class1
    Implements INotifyPropertyChanged
    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

    Private _ModeSta1 As Boolean
    Property ModeSta1 As Boolean
        Get
            Return _ModeSta1
        End Get
        Set(ByVal value As Boolean)
            _ModeSta1 = value
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(ModeSta1)))
        End Set
    End Property

End Class

将 CheckBox 更改为仅绑定到 ModeSta1 属性

<CheckBox x:Name="ckbx1" 
    Content=" Input" 
    Margin="99.866,78.932,0,0" 
    VerticalAlignment="Top" 
    HorizontalAlignment="Left" 
    IsChecked="{Binding Path=ModeSta1, Mode=TwoWay}" 
/>

ModeSta1的值改变时,用户界面会更新,如果用户点击复选框,ModeSta1的值也会改变。

    Dim c = New Class1
    DataContext = c
    ' You can change the property and this change will be visible on the UI
    c.ModeSta1 = True

【讨论】:

  • 明白了......终于。简而言之,您在代码中设置 Datacontext 的最后一行代码就是答案。这就是我的代码中缺少的内容以及它无法正常工作的原因。所以在 ckbx1.Click 事件子中,我只需要添加这行简单的代码:DataContex = Bools。这使得对象“Bools”可用于绑定。
  • 我很乐意提供帮助。是的,我经常以这种方式使用它。效果很好。我几乎从不直接操作 UI,在内存中操作 Binded 对象更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2016-09-26
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
相关资源
最近更新 更多