【问题标题】:How to set value in WPF datagridtextcolumn cell when the datagridcombobox cell value is changed?当datagridcombobox单元格值更改时,如何在WPF datagridtextcolumn单元格中设置值?
【发布时间】:2011-01-20 04:52:55
【问题描述】:

我正在使用 WPF 4.0 Datagrid 开发应用程序。我的 Datagrid 网格有一个 datagridcomboboxcolumn 和一个 datagridtextcolumn。如何使用 datagridcomboboxcolumn 的 SelectedIndex_Changed 事件更改 datagrid 文本单元格的值?

【问题讨论】:

    标签: wpf datagrid datagridcomboboxcolumn datagridtextcolumn


    【解决方案1】:

    我建议使用 MVVM 方法来创建 WPF 应用程序。一般来说,这意味着您将停止处理诸如SelectedIndex_Changed 之类的离散事件,而是绑定到 ViewModel (VM) 和/或 Model (M) 中的可观察对象。

    使用这种架构,解决您的问题很容易。只需将 DataGridComboBoxColumn 的 SelectedItemBinding 绑定到 DataGrid 的 ItemSource 对象上的属性。然后,将您的 DataGridTextColumn 绑定到该属性。这在代码中得到了更好的解释:

    查看:

    <!-- Previous Window XAML omitted, but you must set it's DataContext to the ViewModel -->
    <DataGrid
        CanUserAddRows="False"
        AutoGenerateColumns="False"
        ItemsSource="{Binding People}"
        >
        <DataGrid.Columns>
            <DataGridTextColumn
                Header="Selected Name"
                Binding="{Binding Name}"
                />
            <DataGridComboBoxColumn
                Header="Available Names"
                SelectedItemBinding="{Binding Name}"
                >
                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="{x:Type ComboBox}">
                        <Setter Property="ItemsSource" Value="{Binding Names}" />
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="{x:Type ComboBox}">
                        <Setter Property="ItemsSource" Value="{Binding Names}" />
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
            </DataGridComboBoxColumn>
        </DataGrid.Columns>
    </DataGrid>
    

    视图模型:

    internal class MainWindowViewModel : ViewModelBase
    {
        private ObservableCollection<Person> _people;
        public ObservableCollection<Person> People
        {
            get
            {
                _people = _people ?? new ObservableCollection<Person>()
                {
                    new Person(),
                    new Person(),
                    new Person(),
                };
    
                return _people;
            }
        }
    }
    

    型号:

    internal class Person : INotifyPropertyChanged
    {
        private static ObservableCollection<string> _names = new ObservableCollection<string>()
        {
            "Chris",
            "Steve",
            "Pete",
        };
    
        public ObservableCollection<string> Names
        {
            get { return _names; }
        }
    
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                if (_name != value)
                {
                    _name = value;
                    this.RaisePropertyChanged(() => this.Name);
                }
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        private void RaisePropertyChanged<T>(Expression<Func<T>> expr)
        {
            var memberExpr = expr.Body as MemberExpression;
    
            if (memberExpr != null)
            {
                var handler = this.PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(memberExpr.Member.Name));
                }
            }
            else
            {
                throw new ArgumentException(String.Format("'{0}' is not a valid expression", expr));
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多