WPF DataGrid列:如何管理值更改事件
在我的WPF C#项目中,我有一个Datagrid,如下所示:WPF DataGrid列:如何管理值更改事件,wpf,events,datagrid,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 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>
如何修改它以获得预期的结果
谢谢您似乎是从WinForms的角度来看待这个问题的。在WPF中,我们通常更喜欢操作数据对象而不是UI对象。您说过您的物品没有可观察收集
,但我建议您使用一个
如果您的数据没有数据类型类,那么我建议您创建一个。
然后,您应该在其中实现INotifyPropertyChanged
接口
执行此操作并将集合属性设置为DataGrid
的ItemsSource
后,只需将INotifyPropertyChanged
处理程序附加到选定的数据类型:
在视图模型中:
public ObservableCollection<YourDataType> Items
{
get { return items; }
set { items = value; NotifyPropertyChanged("Items"); }
}
public YourDataType SelectedItem
{
get { return selectedItem; }
set { selectedItem = value; NotifyPropertyChanged("SelectedItem"); }
}
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();
}
在视图模型中:
public ObservableCollection<YourDataType> Items
{
get { return items; }
set { items = value; NotifyPropertyChanged("Items"); }
}
public YourDataType SelectedItem
{
get { return selectedItem; }
set { selectedItem = value; NotifyPropertyChanged("SelectedItem"); }
}
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();
}
在UI中:
<DataGrid ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" ... />
您似乎是从WinForms的角度来看待这个问题。在WPF中,我们通常更喜欢操作数据对象而不是UI对象。您说过您的物品没有可观察收集
,但我建议您使用一个
如果您的数据没有数据类型类,那么我建议您创建一个。
然后,您应该在其中实现INotifyPropertyChanged
接口
执行此操作并将集合属性设置为DataGrid
的ItemsSource
后,只需将INotifyPropertyChanged
处理程序附加到选定的数据类型:
在视图模型中:
public ObservableCollection<YourDataType> Items
{
get { return items; }
set { items = value; NotifyPropertyChanged("Items"); }
}
public YourDataType SelectedItem
{
get { return selectedItem; }
set { selectedItem = value; NotifyPropertyChanged("SelectedItem"); }
}
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();
}
在视图模型中:
public ObservableCollection<YourDataType> Items
{
get { return items; }
set { items = value; NotifyPropertyChanged("Items"); }
}
public YourDataType SelectedItem
{
get { return selectedItem; }
set { selectedItem = value; NotifyPropertyChanged("SelectedItem"); }
}
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();
}
在UI中:
<DataGrid ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" ... />
为什么不能在百分比
和/或对齐
属性的设置器中执行您想要的操作?这就是当值changes@dkozl我需要知道怎么做…你能给我一个例子吗?因为你可以修改百分比
我假设它有getterget
和setterset
所以在setter中触发你想要触发的东西,只要设置了百分比
值:set{…[trigger action]}
@dkozl我需要一个清晰的例子…请在我的编辑中点击,并根据它给出一个例子。谢谢您为什么不能在百分比
和/或对齐
属性的设置器中执行您想要的操作?这就是当值changes@dkozl我需要知道怎么做…你能给我一个例子吗?因为你可以修改百分比
我假设它有getterget
和setterset
所以在setter中触发你想要触发的东西,只要设置了百分比
值:set{…[trigger action]}
@dkozl我需要一个清晰的例子…请在我的编辑中点击,并根据它给出一个例子。ThanksI将遵循您的建议并尝试使用此代码。我会让你知道,看看我的编辑,给我一个例子,如何改变它,以获得你刚才向我描述的结果。谢谢,现在您有了一个数据类型类:FixedPosition
。现在您需要在其中实现INotifyPropertyChanged
接口。。。网上有一百万个关于如何做到这一点的教程。完成后,请看我答案中的第一个代码部分。。。您需要一个FixedPosition
对象的集合,因此添加这两个属性(来自我的代码),但将YourDataType
替换为FixedPosition
。完成后,将PropertyChanged
处理程序附加到SelectedItem
对象,然后将显示的属性添加到DataGrid
中。添加方法DataGrid\u CellEditEnding(对象发送方,DataGridCellEditEndingEventArgs e)是否相同?否,因为在PropertyChanged
事件处理程序中,你会得到一个PropertyChangedEventArgs
对象,告诉你哪个属性已经更改。我会按照你的建议尝试使用这个代码。我会让你知道,看看我的编辑,给我一个例子,如何改变它,以获得你刚才向我描述的结果。谢谢,现在您有了一个数据类型类:FixedPosition
。现在您需要在其中实现INotifyPropertyChanged
接口。。。网上有一百万个关于如何做到这一点的教程。完成后,请看我答案中的第一个代码部分。。。您需要一个FixedPosition
对象的集合,因此添加这两个属性(来自我的代码),但将YourDataType
替换为FixedPosition
。完成后,将PropertyChanged
处理程序附加到SelectedItem
对象,然后将显示的属性添加到DataGrid
中。添加方法DataGrid\u CellEditEnding(对象发送方,DataGridCellEditEndingEventArgs e)是否相同?否,因为在PropertyChanged
事件处理程序中,您将得到一个PropertyChangedEventArgs
对象,它告诉您哪个属性已更改。