【问题标题】:What is the equivalent of CellValueChanged event in DataGrid in WPFWPF中DataGrid中的CellValueChanged事件的等价物是什么
【发布时间】:2014-04-04 22:04:33
【问题描述】:

我正在修改现有的 WPF 代码。代码,即 xaml 文件,使用 DataGrid 而不是 DataGridView。

我需要使用 CellValueChanged 事件而不是 CellEditEnding。谢谢。

<UserControl x:Class="myclass.view"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
         <Grid x:Name="MainGrid">
         <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <!--<RowDefinition Height="*"/>-->
    </Grid.RowDefinitions>

    <Grid Row="0" >
        <Border Background="Transparent">

            <Border.ContextMenu> 
                <ContextMenu>
                    <MenuItem Header="New Name" Command="{Binding Path=CreateNewNameCommand}"/>
                    <MenuItem Header="Delete Name" Command="{Binding Path=DeleteNameCommand}"/>
                </ContextMenu>
            </Border.ContextMenu>                                               
            <DataGrid
  Name="dataGrid1"
    ItemsSource="{Binding SelectedFolderPlane.FolderPlaneItems}"
    SelectedItem="{Binding SelectedGridItem}" 
    vw:DataGridDoubleClick.DoubleClickCommand="{Binding FolderPlaneItemDoubleClickCommand}"
     CellEditEnding="dataGrid1_CellEditEnding"
    SelectionMode="Single"
    SelectionUnit="FullRow"
    AutoGenerateColumns="False"
    BorderBrush="White"
    GridLinesVisibility="None"
    HeadersVisibility="Column"
    IsReadOnly="False"
    HorizontalAlignment="Left"
    VerticalAlignment="Top"
    HorizontalContentAlignment="Stretch"
    VerticalContentAlignment="Stretch">


        <DataGrid.Columns>
            <DataGridTemplateColumn Width="SizeToHeader" Header="" IsReadOnly="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Image Width="16" Height="16" Source="{Binding MyIcon, Mode=OneTime}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Width="*" Binding="{Binding Name, Mode=OneTime}" Header=" Name" IsReadOnly="False" >
                        <DataGridTextColumn.CellStyle>
                            <Style TargetType="DataGridCell">
                                <Setter Property="ToolTip" Value="{Binding ToolTipText}" />
                            </Style>
                        </DataGridTextColumn.CellStyle>
                    </DataGridTextColumn>

            <DataGridTextColumn Width="SizeToHeader" Binding="{Binding LatestMod, Mode=OneTime}" Header=" Version" IsReadOnly="True"/>
            <DataGridTextColumn Width="SizeToHeader" Binding="{Binding Date, Mode=OneTime}" Header="  LatestMod" IsReadOnly="True"/>
            </DataGrid.Columns>

                        <Style TargetType="{x:Type DataGridRow}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding CanShowCatContextMenu}" Value="True">
                <Setter Property="ContextMenu" Value="{StaticResource Condition1ContextMenu}"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding CanShowWFContextMenu}" Value="True">
                <Setter Property="ContextMenu" Value="{StaticResource Condition1ContextMenu}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
    </DataGrid.RowStyle>-->

    </DataGrid>
        </Border>
    </Grid>


</Grid>

【问题讨论】:

  • 你能把“事件处理程序”放在可能绑定的属性的设置器中吗?一点点 XAML/代码可能会有所帮助。
  • 您希望此代码在任何值更改时运行,还是仅在特定值更改时运行?
  • 另外,如果您需要该特定事件,您可以切换到 DataGridView 吗?听起来你几乎可以修改任何你想要的东西。
  • @LordTakkera 我还是个新手,我不知道将整个基础架构更改为 DataGridView 有多么容易。但作为第一个选项,您第一个问题的答案是我希望在用户更改第一列的值时运行此代码,并且我希望也提交更改。
  • 它们非常相似,但听起来您只需要修改绑定(请参阅下面的答案)。

标签: wpf events datagridview datagrid


【解决方案1】:

希望这能达到您的预期(我仍然不完全确定,您的第一列是一个图标,为什么会改变?)

首先,将 Mode 更改为 TwoWay 或 OneWayToSource。这允许单元格中的更改自动更新底层模型(这可能会“提交”更改,除非您绑定到数据库)。两者的区别在于,使用 TwoWay,如果底层模型被修改,视图会改变,而 OneWayToSource 不会。

其次,将 UpdateSourceTrigger 设置为“PropertyChanged”,这将导致每次值更改时都会更新源(而不是要求它失去焦点)。

"{Binding Path=MyProperty, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"

最后,将您要运行的代码(这也可以执行您的“提交”步骤)放入绑定属性的设置器中(或让它调用执行此操作的函数)。

public String MyProperty
{
   get { return _backField; }
   set
   {
      _backField = value;
      BuisnessLogicAndCommit();
   }
}

如果我可以提供任何其他信息,请告诉我。

【讨论】:

  • 谢谢。给你的问题和cmets; 1-试图摆脱第一列中的图标,正如我所说,这是现有代码,我正在努力解决它。
  • 2- 将 UpdateSourceTrigger 设置为 PropertyChanged 的​​代码是什么?由于某种原因,我无法在 XAML 中执行此操作,我想我的语法是错误的。 3-绑定属性的设置器?如果可能的话,我会很感激具体的代码。谢谢
  • 我试图通过提供绑定字符串来解决 (2),以及 (3) 通过提供 (2) 中的绑定引用的示例属性。我不知道如何帮助解决 (1),如果您不想要它,您可以不直接删除该列吗?
  • 我实施了您的所有建议,但还没有奏效。代码的其余部分要复杂得多,例如现在它说 Name 是只读的,不能是 TwoWay。
  • 再次感谢。我明天必须继续这方面的工作。如果我解决了其他问题,然后如果您的解决方案有效,我肯定会将其标记为答案,如果我对您的建议有更多疑问,我将在此处发布。如果可以,请在 20 小时后回来查看。再次感谢。
猜你喜欢
  • 2010-09-19
  • 2012-01-09
  • 2015-10-17
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 2012-07-20
  • 2023-03-30
  • 2011-04-08
相关资源
最近更新 更多