c# - WPF - 更新绑定数据时 DataGrid 不更新
问题描述
我有一个DataGrid
绑定到ObservableCollection
.
ObservableCollection
( ViewLock
)的元素之一是Boolean
将双向绑定到 a 的 a CheckBox
,我希望在应用程序用户选中或取消选中CheckBox
. 为此,我实施了INotifyPropertyChanged
. 这部分似乎有效,因为每次我更改定义中设置的值MessageBox
时都会打开。CheckBox
ObservableCollection
但是,我的 WPF 中有两个其他元素绑定到相同的元素Boolean
:一个是dataRow
使用集合的颜色,RowStyle
另一个是IsEnabled
a的颜色ComboBox
。当 的值更新时,这两件事都不会ViewLock
更新。DataGrid
当我使用按钮强制刷新时,它们确实会更新。
我希望我的RowStyle
andComboBox 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
解决方案
推荐阅读
- intellij-idea - Intellij Idea,打开新项目为每个项目创建一个新选项卡,如何恢复每个打开项目的默认新窗口?
- anaconda - 将 MiniConda 从 32 位升级到 64 位
- r - 根据少数条件创建新变量
- r - 使用闪亮的R中多列的旭日形图
- reactjs - 无法实现加载器
- python - Python如何将字符串转换为字节?
- mysql - mysql命令行停留在“->”
- file - 尽管使用文件的绝对路径或将数据文件放在工作目录中,h5 文件打开错误
- c++ - C++ 必须接受一个或零个参数错误 (Operator+)
- javascript - Vue img 未在 v-for 列表中呈现