捕获可编辑数据网格中更改的单元格

时间:2012-03-06 23:03:29

标签: wpf vb.net visual-studio wpf-controls

我在VB WPF应用程序中有一个可编辑的DataGrid。 DataGrid本身的SourceUpdated属性设置为我的事件处理程序。网格中的2列是可编辑的,并且将Binding中的NotifyOnSourceUpdated标志设置为True。该事件正在解雇,但我似乎无法找出确定变化的最佳方法。 2列相互依赖,其中一列是项目数量,另一列是案例数量。如果用户更改其中一个,我想重新计算另一个值并更新网格和绑定源。我确信有很多方法可以解决这个问题,但我很好奇最好的方法是什么。我可以在datagrid上监听更改事件,查看更改内容,设置一些变量,然后在SourceUpdated事件中使用它们,但这看起来并不优雅。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我建议你走出活动处理人员的世界! WPF不鼓励采用旧的WinForms方法在事件处理程序中执行所有操作。

MVVM方式....

您必须以MVVM方式利用模型类的强大功能。数据网格的绑定集合必须是某些项目的集合...例如如果您的数据网格显示Employees列表,那么您的集合必须是IEnumerable<Employee> ...所以Employee类可以在这里帮助您。

假设您的数据网格将GenderSaluation显示为两个相互关联的可编辑列。所以你的Employee课应该有以下内容......

1. `Employee` class must implement `INotifyPropertyChanged` interface.
2. `Gender` and `Salutation` properties must raise the `PropertyChanged` event from their property setters.
3. In the setter of `Gender` \ `Salutation` we must write the logic of changing the other field.

E.g。

            private string _gender;
    public string Gender
    {
        get
        {
            return _gender;
        }

        set
        {
            if (_gender != value)
            {
                _gender = value;

                if (_gender == "Male")
                {
                    Salutation = "Mr";
                }
                else if (_gender == "Female"
                     && (Salutation == "Mr" || string.IsNullOrEmpty(Salutation)))
                {
                    Salutation = "Ms";
                }
                else if (string.IsNullOrEmpty(_gender))
                {
                    Salutation = string.Empty;
                }

                OnPropertyChanged("Gender");
            }
        }
    }

    private string _salutation;
    public string Salutation
    {
        get
        {
            return _salutation;
        }

        set
        {
            if (_salutation != value)
            {
                _salutation = value;

                if (_salutation == "Mrs" || _salutation == "Ms")
                {
                    Gender = "Female";
                }
                else if (_salutation == "Mr")
                {
                    Gender = "Male";
                }
                else if (string.IsNullOrEmpty(_salutation))
                {
                    Gender = string.Empty;
                }

                OnPropertyChanged("Salutation");
            }
        }
    }

OnPropertyChanged()是......

    public void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

这样,您的GUI将自动执行相关字段的转换。

ValueConverter方式......

如果您的字段不是存储在模型中但仅用于显示目的,那么您可以使用ValueConverter ....

public class GenderToSalutationConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert
        (object value, Type targetType,
        object parameter, System.Globalization.CultureInfo culture)
    {
        var _gender = (string) value;
        if (_gender == "Male")
        {
            return "Mr";
        }
        else if (_gender == "Female")
        {
            return "Ms";
        }

        return string.Empty;
    }

    public object ConvertBack
           (object value, Type targetType, object parameter,
            System.Globalization.CultureInfo culture)
    {
        var _salutation = (string)value;
        if (_salutation == "Mrs" || _salutation == "Ms")
        {
            return "Female";
        }
        else if (_salutation == "Mr")
        {
            return "Male";
        }

        return string.Empty;
    }

    #endregion
}
XAML

中的

   <UserControl.Resources>
       <local:GenderToSalutationConverter x:Key="GenderToSalutationConverter"/>
   </UserControl.Resources>
   <tk:DataGrid ItemsSource="{Binding Employees}">
        <tk:DataGrid.Columns>
             <tk:DataGridTextColumn
                        Header="Sex"
                        Binding="{Binding Gender,
                           Converter={StaticResource GenderToSalutationConverter}}">
            </tk:DataGridTextColumn>
            <tk:DataGridTextColumn
                        Header="Title"
                        Binding="{Binding Salutation}">
            </tk:DataGridTextColumn>
        </tk:DataGrid.Columns>
    </tk:DataGrid>

希望这会有所帮助......