【问题标题】:VB.net WPF Databinding not updating TextBox when DataGrid item selected选择 DataGrid 项目时,VB.net WPF 数据绑定不更新文本框
【发布时间】:2016-01-17 09:22:07
【问题描述】:

大家好,

我已经搜索并搜索了此问题的答案,非常感谢有人的帮助!我敢肯定这是我缺少的一些简单的东西......

我的 DataGrid 似乎可以正确绑定并正确更新,但是 文本框和复选框没有更新。它们最初设置正确,但在选择另一个 DataGrid 项时不会更新。

如果我将文本框绑定直接设置为选定对象字符串,例如<TextBox x:Name="txtLastName" Text="{Binding Selection.LastName, Mode=TwoWay}" 然后文本框 do 更新新的选择(并正常工作)。但是以同样的方式绑定复选框是行不通的。我也相信这不是最佳做法......?绑定到 ViewModel LastName() 属性不是更好吗?

我有一个带有 DataGrid 和几个文本框和复选框的 MembersView

<DataGrid ItemsSource="{Binding Path=MemberCollection}" SelectedItem="{Binding Path=Selection, Mode=TwoWay}" Name="DataGrid1"/>

<TextBox x:Name="txtFirstName" Text="{Binding FirstName, Mode=TwoWay}" />
<TextBox x:Name="txtLastName" Text="{Binding LastName, Mode=TwoWay}" />

<CheckBox x:Name="chbChairman" IsChecked="{Binding GeneralChairman}" Content="Chairman" />
<CheckBox x:Name="chbFillins" IsChecked="{Binding GeneralFillins}" Content="Fillins" />

代码隐藏集:DataContext = memberViewModel

MembersViewModel 包含:

Public Class MemberViewModel
Inherits ViewModelBase  ' This implements INotifyPropertyChanged

Private _objMember As Member
Private _MemberCollection As MemberCollection
Dim _selectedMember As Member

Public Property Selection() As Member
    Get
        Return _selectedMember
    End Get
    Set(ByVal value As Member)
        If value Is _selectedMember Then
            Return
        End If
        _selectedMember = value
        OnPropertyChanged("Selection")
    End Set
End Property

Public Property MemberCollection As MemberCollection
    Get
        Return _MemberCollection
    End Get
    Set(ByVal value As MemberCollection)
        _MemberCollection = value
        OnPropertyChanged("MemberCollection")
    End Set
End Property

Public Property Member() As Member
    Get
        Return _objMember
    End Get
    Set(ByVal Value As Member)
        _objMember = Value
        OnPropertyChanged("Member")
    End Set
End Property

Public Property FirstName() As String
    Get
        Return _objMember.FirstName
    End Get
    Set(ByVal Value As String)
        _objMember.FirstName = Value
        OnPropertyChanged("FirstName")
    End Set
End Property

Public Property LastName() As String
    Get
        Return _objMember.LastName
    End Get
    Set(ByVal Value As String)
        _objMember.LastName = Value
        OnPropertyChanged("LastName")
    End Set
End Property

Public Property GeneralChairman() As Boolean
    Get
        Return _objMember.MemberUseFor.GeneralChairman
    End Get
    Set
        _objMember.MemberUseFor.GeneralChairman = Value
        OnPropertyChanged("GeneralChairman")
    End Set
End Property

Public Property GeneralFillins() As Boolean
    Get
        Return _objMember.MemberUseFor.GeneralFillins
    End Get
    Set
        _objMember.MemberUseFor.GeneralFillins = Value
        OnPropertyChanged("GeneralFillins")
    End Set
End Property

我的会员模型包含:

Public Property FirstName As String
Public Property LastName As String
Public Property MemberUseFor As MemberUseFor

MemberUseFor 包含:

Public Property GeneralChairman As Boolean
Public Property GeneralFillins As Boolean

MemberMemberUseFor 类没有实现 INotifyPropertyChanged,但我认为这是正确的......?

非常感谢有人帮助解释为什么在 DataGrid 中选择不同的行不会更新我的文本框和复选框。

再次感谢! 达米安

【问题讨论】:

    标签: asp.net wpf vb.net datagrid


    【解决方案1】:

    您在这里混淆了一些事情:

    1. 您的Member 属性似乎没有任何用处。 SelectionMember 似乎在做同样的工作。所以删除Member 属性及其底层本地成员_objMember
    2. 如果您想遵循 Microsoft 约定,Selection 属性最好命名为 SelectedMember
    3. FirstNameLastName 确实应该在 Member 类中定义,而不是在 MembersViewModel 中。
    4. TextBoxCheckBox 对象的绑定将采用 Text="{Binding SelectedMember.LastName, Mode=TwoWay}" 等形式。
    5. MemberViewModelMember 类应该实现 INotifyPropertyChanged。更好的是使用一些 MVVM 框架,例如MVVM Light。这将使您的工作更加轻松。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-24
      • 2018-10-26
      • 2011-09-22
      • 2023-04-04
      • 2023-03-16
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多