【问题标题】:ComboBox within RadGridView's Header Binding is Breaking After switching tabsRadGridView 的标题绑定中的组合框在切换选项卡后中断
【发布时间】:2011-05-17 20:35:56
【问题描述】:

我在 TabControl 中有几个 Telerik RadGridViews。

每个 RadGridView 都有一个包含 CheckBox 的列。该列的标题是一个 CheckBox。当用户单击表头中的 CheckBox 时,列中的 CheckBox 会相应地被选中或取消选中。

CheckBoxes 的选中/取消选中适用于默认选中的选项卡中的 RadGridView。

选中/取消选中在默认情况下未选中的选项卡中的任何 RadGridView 中都不起作用。当您返回默认选择的选项卡时,它仍然有效。

我复制了标题中的 CheckBox 并将其放在 RadGridView 上方,切换选项卡后它可以正常工作...如果您选中/取消选中此 CheckBox,它将选中/取消选中网格中的所有 CheckBox ...但是 Header 中的 CheckBox 不起作用。

如果页面加载时 Grid 不可见,则几乎就像未应用 Grid 标题中 CheckBox 的绑定一样......

我想知道是否有人知道如何解决这个问题。

<TablControl>
  <TabItem Header="Items">
    <telerik:RadGridView x:Name="GridA" AutoGenerateColumns="False" ItemsSource="{Binding MyItems}">
        <telerik:RadGridView.Columns>
            <telerik:GridViewBoundColumnBase>
                <telerik:GridViewBoundColumnBase.Header>
                    <CheckBox IsChecked="{Binding ElementName=TheElementBoundToTheViewModel, Path=DataContext.SelectAllMyItems, Mode=TwoWay}" />
                </telerik:GridViewBoundColumnBase.Header>
                <telerik:GridViewBoundColumnBase.CellTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding IsSelected}"></CheckBox>
                    </DataTemplate>

                </telerik:GridViewBoundColumnBase.CellTemplate>
            </telerik:GridViewBoundColumnBase>
    <!-- ...... other stuff  ..... -->

        </telerik:RadGridView.Columns>
    </telerik:RadGridView>
  </TabItem>
  <TabItem Header="ItemsB">
   <telerik:RadGridView x:Name="GridB" AutoGenerateColumns="False" ItemsSource="{Binding MyItemsB}">
        <telerik:RadGridView.Columns>
            <telerik:GridViewBoundColumnBase>
                <telerik:GridViewBoundColumnBase.Header>
                    <CheckBox IsChecked="{Binding ElementName=TheElementBoundToTheViewModel, Path=DataContext.SelectAllMyItems, Mode=TwoWay}" />
                </telerik:GridViewBoundColumnBase.Header>
                <telerik:GridViewBoundColumnBase.CellTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding IsSelected}"></CheckBox>
                    </DataTemplate>

                </telerik:GridViewBoundColumnBase.CellTemplate>
            </telerik:GridViewBoundColumnBase>
    <!-- ...... other stuff  ..... -->

        </telerik:RadGridView.Columns>
    </telerik:RadGridView>
  </TabItem>
</TabControl>

这是我的 ViewModel:

Public Class MyItemsVM
  Inherits ViewModelBase

  Private _selectAllMyItems As Boolean    
  Public Property MyItems As ObservableCollection(Of MyItemSelectionVM)
  Public Property SelectAllMyItems As Boolean
    Get
      Return _selectAllMyItems 
    End Get
    Set(ByVal value As Boolean)
        _selectAllMyItems = value
        For Each ivm In MyItems 
            ivm.IsSelected = _selectAllMyItems
        Next
        MyBase.RaisePropertyChangedEvent(Me, SelectAllMyItemsChanged)
      End Set
  End Property



  Private _selectAllMyItemsB As Boolean
  Public Property MyItemsB As ObservableCollection(Of MyItemSelectionVM)
  Public Property SelectAllMyItemsB As Boolean
    Get
      Return _selectAllMyItemsB
    End Get
    Set(ByVal value As Boolean)
        _selectAllMyItemsB = value
        For Each ivm In MyItemsB 
            ivm.IsSelected = _selectAllMyItemsB
        Next
        MyBase.RaisePropertyChangedEvent(Me, SelectAllMyItemsBChanged)
      End Set
  End Property




  Public Sub New(ByVal items As MyItemList,ByVal itemsB As MyItemList)

     MyItems = New ObservableCollection(Of MyItemSelectionVM)
     For Each item In items
       MyItems.Add(New MyItemSelectionVM(item))
     Next

     MyItemsB = New ObservableCollection(Of MyItemSelectionVM)
     For Each item In itemsB
       MyItemsB.Add(New MyItemSelectionVM(item))
     Next

  End Sub

End Class



Public Class MyItemSelectionVM
    Implements INotifyPropertyChanged
    Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged

    Private _isSelected As Boolean
    Private _item As MyItem

    Public Property MyItem As MyItem
        Get
            Return _item 
        End Get
        Set(ByVal value As MyItem)
            _item = value
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("MyItem"))
        End Set
    End Property

    Public Property IsSelected As Boolean
        Get
            Return _isSelected
        End Get
        Set(ByVal value As Boolean)
            _isSelected = value
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("IsSelected"))
        End Set
    End Property

    Public Sub New(ByVal theItem As MyItem)
        _item = theItem
    End Sub
End Class

感谢您的帮助

-弗林尼

【问题讨论】:

    标签: wpf binding telerik


    【解决方案1】:

    我通过为视图模型创建静态资源解决了这个问题。绑定到静态资源而不是元素的 DataContext 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      相关资源
      最近更新 更多