WPF DataGrid列:如何管理值更改事件

时间:2013-09-10 13:56:26

标签: wpf events datagrid

在我的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链接的可观察集合。

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

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

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

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

由于

1 个答案:

答案 0 :(得分:4)

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

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

执行此操作并将您的集合属性设置为ItemsSource的{​​{1}}后,您需要做的就是将DataGrid处理程序附加到您选择的数据类型:

在视图模型中:

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();
}