Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 已在Datagrid.Refresh()上选中Datagrid Update复选框_.net_Wpf_Vb.net_Datagrid_Wpfdatagrid - Fatal编程技术网

.net 已在Datagrid.Refresh()上选中Datagrid Update复选框

.net 已在Datagrid.Refresh()上选中Datagrid Update复选框,.net,wpf,vb.net,datagrid,wpfdatagrid,.net,Wpf,Vb.net,Datagrid,Wpfdatagrid,我有一个datagrid,他的ItemsSource是一个强类型IEnumerable对象 在这个datagrid中,我有一个复选框列、一个价格列、一个零件名称列和一个“销售总额”列 选中复选框后,我需要使用价格列中的值更新total selling for列 这部分我已经在工作了,但是,当这种情况发生时,我如何使复选框保持选中状态 Private Sub UpdateSellFor(sender As System.Object, e As System.Windows.RoutedEvent

我有一个datagrid,他的ItemsSource是一个强类型IEnumerable对象

在这个datagrid中,我有一个复选框列、一个价格列、一个零件名称列和一个“销售总额”列

选中复选框后,我需要使用价格列中的值更新total selling for列

这部分我已经在工作了,但是,当这种情况发生时,我如何使复选框保持选中状态

Private Sub UpdateSellFor(sender As System.Object, e As System.Windows.RoutedEventArgs)
    Dim _CB As CheckBox = DirectCast(sender, CheckBox)
    Dim _ID As Integer = _CB.Tag
    Dim _PP = DirectCast(DG_PartsToSelect.CurrentItem, PartTyping).PartPrice
    If _CB.IsChecked Then
        DG_PartsToSelect.CurrentItem.PartSellingFor = DirectCast(DG_PartsToSelect.CurrentItem, PartTyping).PartPrice
        DG_PartsToSelect.Items.Refresh()
    Else

    End If
    '_CB.IsChecked = True
End Sub
取消注释_CB.IsChecked=True不起任何作用

以下是此数据网格的XAML:

                <DataGrid IsReadOnly="True" AutoGenerateColumns="False" Grid.Column="1" HorizontalAlignment="Stretch" Margin="3" Name="DG_PartsToSelect" VerticalAlignment="Stretch">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Part ID" Binding="{Binding PartID}" />
                        <DataGridTemplateColumn Header="Part Name">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding PartName}" Cursor="Hand" MouseDown="PartDetails" Tag="{Binding PartID}" ToolTip="Click to See the Part Details" />
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTextColumn Header="Selling For" Binding="{Binding PartPrice, StringFormat='{}{0:C}'}" />
                        <DataGridTemplateColumn Header="Part Options">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <Image Cursor="Hand" Height="22" Name="options" Tag="{Binding PartID}" MouseDown="PartOptions" Source="/v2Desktop;component/Images/Application.png" ToolTip="Select Part Options" />
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTemplateColumn Header="Sell This Part">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <CheckBox Name="SelectedPart" Tag="{Binding PartID}" ToolTip="Select This Part" Click="UpdateSellFor" />
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTextColumn Header="Total Selling For" Binding="{Binding PartSellingFor, StringFormat='{}{0:C}'}" />
                    </DataGrid.Columns>
                </DataGrid>


非常确定发生的情况是在更新(设置)之前触发此事件。因此,当您刷新时,您将获得先前的值。在调用refresh之前,将复选框的值指定给属性。

下面是一个示例,说明了它是如何更符合WPF的方式的,希望这能让您找到正确的方向。 我已经很久没有接触Visual Basic了,所以请注意我错过的一些约定

Xaml:

    <DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="3" x:Name="DG_PartsToSelect" VerticalAlignment="Stretch" ItemsSource="{Binding}">
      <DataGrid.Columns>
        <DataGridTextColumn Header="ID" Binding="{Binding Path=ID}" IsReadOnly="True" />
        <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" IsReadOnly="True"/>
        <DataGridTemplateColumn Header="Selling For">
          <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
              <TextBlock Text="{Binding Path=SellingPrice, StringFormat='{}{0:C}', Mode=OneWay}"/>
            </DataTemplate>
          </DataGridTemplateColumn.CellTemplate>
          <DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
              <TextBox Text="{Binding Path=SellingPrice, UpdateSourceTrigger=PropertyChanged}"/>
            </DataTemplate>
          </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Part Options">
          <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
              <Border Background="#88BBFF" Cursor="Hand" Height="22" ToolTip="Select Part Options" MouseUp="PartOptions_MouseUp"/><!--just for testing with no image-->
              <!--<Image Cursor="Hand" Height="22" Source="" ToolTip="Select Part Options" MouseDown="PartOptions_MouseDown"/>-->
            </DataTemplate>
          </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Sell This Part">
          <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
              <CheckBox Name="SelectedPart" IsChecked="{Binding Path=IsCalculated, UpdateSourceTrigger=PropertyChanged}" ToolTip="Select This Part"  />
            </DataTemplate>
          </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn IsReadOnly="True" Header="Total Selling For" Binding="{Binding Path=TotalSellingFor, StringFormat='{}{0:C}'}" />
      </DataGrid.Columns>
    </DataGrid>

只是一个猜测,但您是否意外地在CellTemplate中的TemplateColum中创建了文本框,否则请提供一些xaml。想想看;请务必提供xaml。复选框是一个模板,是的,但不是总销量。大多数情况下,没有例如CellEditingTemplate的CellTemplate中的复选框在选中时重置为false,因为查看您的方法会让我假设您在xaml中的复选框上没有绑定。不是正式的否。但是.Tag是bound。我建议您向绑定的类添加一个IsCalculated DependencyProperty,并将复选框绑定到该类。在PropertyChangedCallbackHandler中,您可以使用
DependencyObject d
作为项目更新该行的价格。让我知道你是否想要一个例子。哪个事件?设置什么属性?请看我贴的代码。它包含复选框的“Click”事件中发生的所有事件,并且比Click事件中发生的更多。检查_cb上的集合-它是否被调用以及传递了什么值?“检查集合”???只是不知道你说的是什么意思。当我调试代码时,该复选框在整个过程中都是唯一的…很抱歉,您没有对上的数据进行绑定,但我已经在这一行上收到一个错误:公共事件属性更改为ComponentModel.PropertyChangedEventHandler实现INotifyPropertyChanged.PropertyChanged on INotifyPropertyChanged而没有任何建议状态INotifyPropertyChanged未定义,但我缺少:实现INotifyPropertyChanged。。。嗯。。。看不见,你把我带到了正确的方向。解决方案实际上要简单得多。我确实需要在复选框本身上绑定IsChecked,我在PartsTyping类中创建了一个新属性boolean=false,然后在UpdateSellFor中,我只需将该字段的值更改为True(如果再次单击,则返回为false)。您知道是否有办法将多个解决方案作为答案授予?
Imports System.ComponentModel
Imports System.Collections.ObjectModel

Class MainWindow

  Dim Parts As ObservableCollection(Of Part)

  Private Sub PartOptions_MouseUp(sender As System.Object, e As System.Windows.Input.MouseButtonEventArgs)
    If DG_PartsToSelect.SelectedItem Is Nothing Then
      Exit Sub
    End If
    Dim selectedPart = DirectCast(DG_PartsToSelect.SelectedItem, Part)
    MessageBox.Show(String.Format("The name = {0}", selectedPart.Name), String.Format("The id = {0}", selectedPart.ID), MessageBoxButton.OK, MessageBoxImage.Information)
  End Sub

  Public Sub New()
    InitializeComponent()
    Parts = New ObservableCollection(Of Part)
    Parts.Add(New Part(1, "test", 100D))
    Parts.Add(New Part(2, "Name here", 99.99D))
    Parts.Add(New Part(3, "What", 23.19D))
    DG_PartsToSelect.DataContext = Parts
  End Sub
End Class

Public Class Part : Implements INotifyPropertyChanged

  Private IDField As Integer
  Public Property ID() As Integer
    Get
      Return IDField
    End Get
    Set(ByVal value As Integer)
      IDField = value
      OnPropertyChanged("ID")
    End Set
  End Property

  Private NameField As String
  Public Property Name() As String
    Get
      Return NameField
    End Get
    Set(ByVal value As String)
      NameField = value
      OnPropertyChanged("Name")
    End Set
  End Property

  Private SellingPriceField As Decimal
  Public Property SellingPrice() As Decimal
    Get
      Return SellingPriceField
    End Get
    Set(ByVal value As Decimal)
      SellingPriceField = value
      OnPropertyChanged("SellingPrice")
      IsCalculatedField = False
      OnPropertyChanged("IsCalculated")
    End Set
  End Property

  Private IsCalculatedField As Boolean
  Public Property IsCalculated() As Boolean
    Get
      Return IsCalculatedField
    End Get
    Set(ByVal value As Boolean)
      If (IsCalculatedField And Not value) Then
        Exit Property
      End If
      IsCalculatedField = value
      UpdateTotalPrice()
    End Set
  End Property

  Private TotalSellingForField As Decimal
  Public Property TotalSellingFor() As Decimal
    Get
      Return TotalSellingForField
    End Get
    Set(ByVal value As Decimal)
      TotalSellingForField = value
    End Set
  End Property

  Public Event PropertyChanged As PropertyChangedEventHandler _
        Implements INotifyPropertyChanged.PropertyChanged

  Public Sub New(id As Integer, name As String, sellingPrice As Decimal)
    IDField = id
    NameField = name
    SellingPriceField = sellingPrice
  End Sub

  Sub UpdateTotalPrice()
    ''This will multiply the price of the SellingPriceValue times 2 and put it in the TotalSellingForField
    TotalSellingForField = SellingPriceField * 2
    OnPropertyChanged("TotalSellingFor")
  End Sub

  Sub OnPropertyChanged(propertyName As String)
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
  End Sub

End Class