首页 > 解决方案 > WPF - 更新绑定数据时 DataGrid 不更新

问题描述

我有一个DataGrid绑定到ObservableCollection.

ObservableCollection( ViewLock)的元素之一是Boolean将双向绑定到 a 的 a CheckBox,我希望在应用程序用户选中或取消选中CheckBox. 为此,我实施了INotifyPropertyChanged. 这部分似乎有效,因为每次我更改定义中设置的值MessageBox时都会打开。CheckBoxObservableCollection

但是,我的 WPF 中有两个其他元素绑定到相同的元素Boolean:一个是dataRow使用集合的颜色,RowStyle另一个是IsEnableda的颜色ComboBox。当 的值更新时,这两件事都不会ViewLock更新。DataGrid当我使用按钮强制刷新时,它们确实会更新。

我希望我的RowStyleandComboBox IsEnabled值在更新时立即自动ViewLock更新,但到目前为止,我的任何尝试都没有导致任何地方。

我在这里想念什么?

这是我的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:WPF_ViewTemplate"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"
        Loaded="Window_Loaded">
    <Grid>
        <Canvas Name ="Canvas1" Background="#FFE5E5E5">
            <Label Content="All Views" HorizontalAlignment="Left" Margin="40,30,0,0" VerticalAlignment="Top" Height="26" Width="57"/>
            <DataGrid Name="DataGridGeneral" AutoGenerateColumns="False" Height="239" Canvas.Left="68" Canvas.Top="61" Width="661">
                <DataGrid.RowStyle>
                    <Style TargetType="DataGridRow">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ViewLock }" Value="True">
                                <Setter Property="Background" Value="DarkGray"></Setter>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding ViewLock, Mode=TwoWay}" Value="False">
                                <Setter Property="Background" Value="WhiteSmoke"></Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </DataGrid.RowStyle>
                <DataGrid.Columns>
                    <DataGridTextColumn Header="View Name" Binding="{Binding ViewName}" IsReadOnly="True"/>
                    <DataGridTemplateColumn Header="View Template">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding VTList}" IsEnabled="{Binding ViewLock }" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="Lock/Unlock">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="{Binding Path=ViewLock, UpdateSourceTrigger=PropertyChanged}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Canvas>
        <Button Content="OK" Click="OK_OnClick" HorizontalAlignment="Left" Margin="717,380,0,0" VerticalAlignment="Top"/>
        <Button Content="Cancel" HorizontalAlignment="Left" Margin="667,380,0,0" VerticalAlignment="Top"/>
    </Grid>
</Window>

我的代码隐藏:

Imports System.Windows.Markup
Imports System.Collections.ObjectModel
Class MainWindow
    ReadOnly ViewClass As New InfoList

    Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)

        ViewClass.FillLists()
        DataGridGeneral.ItemsSource = ViewClass.ViewList

    End Sub

    Private Sub OK_OnClick(sender As Object, e As RoutedEventArgs)

        ViewClass.ViewList(1).ViewName = "Updated"
        CType(Canvas1.Children(1), DataGrid).Items.Refresh()

    End Sub

End Class

这是我定义ObservableCollection和启动的方式INotifyPropertyChanged

Imports System.ComponentModel

Public Class GeneralObservableCollection

    Implements INotifyPropertyChanged

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

    Friend Sub New(ViewName As String, VTList As List(Of String), ViewLock As Boolean)

        _ViewName = ViewName
        _VTList = VTList
        _ViewLock = ViewLock

    End Sub

    Private _ViewName As String
    Public Property ViewName() As String
        Get
            Return _ViewName
        End Get
        Set(ByVal value As String)
            _ViewName = value
        End Set
    End Property

    Private _VTList As List(Of String)
    Public Property VTList() As List(Of String)
        Get
            Return _VTList
        End Get
        Set(ByVal value As List(Of String))
            _VTList = value
        End Set
    End Property

    Private _ViewLock As Boolean
    Public Property ViewLock() As Boolean
        Get
            Return _ViewLock
        End Get
        Set(ByVal value As Boolean)
            _ViewLock = value
            NotifyPropertyChanged(ViewLock)
        End Set
    End Property

    Public Sub NotifyPropertyChanged(ByVal ViewLock As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(ViewLock))
        ViewName = "Modified"
        MessageBox.Show("DataGridGeneral" & ViewLock & ViewName)
    End Sub

End Class

以下是我为数据网格填写 ObservableCollection 的方法:

Imports System.Collections.ObjectModel
Public Class InfoList

    Public ViewList As New ObservableCollection(Of GeneralObservableCollection)

    Public Sub AddView(ViewName As String, VTList As List(Of String), ViewLock As Boolean)
        ViewList.Add(New GeneralObservableCollection(ViewName, VTList, ViewLock))
    End Sub

    Public Sub FillLists()

        Dim VTList As New List(Of String)({"None", "1/2"" conc", "3/4"" steel", "Plan View"})

        Me.ViewList.Clear()
        Me.AddView("Level 1", VTList, False)
        Me.AddView("Level 1A", VTList, False)
        Me.AddView("S200/AS", VTList, False)
        Me.AddView("S201/01", VTList, False)
        Me.AddView("S201/02", VTList, False)
        Me.AddView("S201/03", VTList, True)

    End Sub

    Public Shared Sub UpdateGridView(GridName As String)
        MessageBox.Show(GridName)
    End Sub


End Class

标签: c#wpfvb.net

解决方案


推荐阅读