Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF DataGrid列:如何管理值更改事件_Wpf_Events_Datagrid - Fatal编程技术网

WPF 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"> &

在我的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>
如何修改它以获得预期的结果

谢谢

您似乎是从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我需要知道怎么做…你能给我一个例子吗?因为你可以修改
百分比
我假设它有getter
get
和setter
set
所以在setter中触发你想要触发的东西,只要设置了
百分比
值:
set{…[trigger action]}
@dkozl我需要一个清晰的例子…请在我的编辑中点击,并根据它给出一个例子。谢谢您为什么不能在
百分比
和/或
对齐
属性的设置器中执行您想要的操作?这就是当值changes@dkozl我需要知道怎么做…你能给我一个例子吗?因为你可以修改
百分比
我假设它有getter
get
和setter
set
所以在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
对象,它告诉您哪个属性已更改。