【问题标题】:WPF DataGrid columns: how to manage event of value changingWPF DataGrid 列:如何管理值更改事件
【发布时间】:2013-09-10 13:56:25
【问题描述】:

在我的 WPF C# 项目中,我有一个 Datagrid,如下所示:

<DataGrid x:Name="FixedPositionDataGrid" HorizontalAlignment="Left" Margin="33,229,0,0" VerticalAlignment="Top" Width="172" Height="128" AutoGenerateColumns="False" FontSize="10" CanUserAddRows="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="indice" Binding="{Binding index}" IsReadOnly="True"/>
            <DataGridTextColumn Header="%" Binding="{Binding percentage}" />                                    
            <DataGridComboBoxColumn x:Name="DataGridComboBoxColumnAlignment" Header="Allineamento barre" SelectedValueBinding="{Binding alignment}"/>
        </DataGrid.Columns>
    </DataGrid>

我需要有一个事件来管理第二列和第三列中的值变化(即“%”和“Allineamento barre”)。不需要插入的值,我只需要在其中一个值发生更改时引发一个事件。 我该如何执行?我需要定义事件方法的方法,我可以在其中定义一些要执行的操作。 我已阅读此how to raise an event when a value in a cell of a wpf datagrid changes using MVVM?,但我没有链接到数据网格的可观察集合。

编辑: Datagrid ItemSource 与以下对象链接:

public class FixedPosition
{
    [XmlAttribute]
    public int index { get; set; }

    public int percentage { get; set; }
    public HorizontalAlignment alignment { get; set; }        
}

如何修改它以获得预期的结果?

谢谢

【问题讨论】:

  • 为什么你不能在percentage 和/或alignment 属性的设置器中做你想做的事?这就是值变化时触发的内容
  • @dkozl 我需要知道怎么做...你能给我一个例子吗?
  • 因为你可以修改 percentage 我假设它有 getter get 和 setter set 所以触发你想要在 setter 中触发的东西,只要设置了 percentage 值: set { ... [trigger action] }
  • @dkozl 我需要一个清晰的例子……看看我的编辑,请给出一个基于它的例子。谢谢

标签: wpf events datagrid


【解决方案1】:

似乎正在从 WinForms 的角度看待这个问题。在 WPF 中,我们通常更喜欢操作数据对象而不是 UI 对象。你说你的物品没有ObservableCollection&lt;T&gt;,但我建议你使用一个。

如果您的数据没有数据类型类,那么我建议您创建一个。 然后你应该在其中实现INotifyPropertyChanged 接口。

完成此操作并将您的集合属性设置为DataGridItemsSource 之后,您需要做的就是将INotifyPropertyChanged 处理程序附加到您选择的数据类型:

在视图模型中:

public ObservableCollection<YourDataType> Items
{
    get { return items; }
    set { items = value; NotifyPropertyChanged("Items"); }
}

public YourDataType SelectedItem
{
    get { return selectedItem; }
    set { selectedItem = value; NotifyPropertyChanged("SelectedItem"); }
}

在视图模型构造函数中:

SelectedItem.PropertyChanged += SelectedItem_PropertyChanged;

在视图模型中:

private void SelectedItem_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    // this will be called when any property value of the SelectedItem object changes
    if (e.PropertyName == "YourPropertyName") DoSomethingHere();
    else if (e.PropertyName == "OtherPropertyName") DoSomethingElse();
}

在用户界面中:

<DataGrid ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" ... />

【讨论】:

  • 我会按照您的建议尝试使用此代码。我会告诉你的
  • 查看我的编辑并举例说明如何更改它以获得您在上面向我描述的结果。谢谢
  • 好的,现在你有了一个数据类型类:FixedPosition。现在您需要在其中实现INotifyPropertyChanged 接口......网上有一百万个教程介绍了如何做到这一点。完成此操作后,请查看我的答案中的第一个代码部分...您需要 FixedPosition 对象的集合,因此添加这两个属性(来自我的代码),但将 YourDataType 替换为 FixedPosition。完成后,将PropertyChanged 处理程序附加到您的SelectedItem 对象,然后将显示的属性添加到您的DataGrid
  • 添加方法DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)是一样的吗?
  • 否,因为在PropertyChanged 事件处理程序中,您会得到一个PropertyChangedEventArgs 对象,它会告诉您哪个属性已更改。
猜你喜欢
  • 2016-03-29
  • 2021-12-08
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
相关资源
最近更新 更多