在我的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; }
}
如何修改它以获得预期的结果?
由于
答案 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();
}