0

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

4

1 回答 1

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));
        }
    }
}
于 2011-01-20T16:21:24.580 回答