Как установить значение в ячейке datagridtextcolumn WPF при изменении значения ячейки datagridcombobox? - PullRequest
0 голосов
/ 20 января 2011

Я занимаюсь разработкой приложения с использованием WPF 4.0 Datagrid. Моя сетка данных имеет одну сетку столбцов данных и одну текстовую колонку. Как изменить значение текстовой ячейки сетки данных с помощью события SelectedIndex_Changed в datagridcomboboxcolumn?

1 Ответ

1 голос
/ 20 января 2011

Я рекомендую использовать подход MVVM для создания приложений WPF. В целом, это означает, что вы перестанете обрабатывать отдельные события, такие как SelectedIndex_Changed, и вместо этого будете связываться с наблюдаемыми объектами в вашей ViewModel (VM) и / или Model (M).

С этой архитектурой решить вашу проблему легко. Просто свяжите SelectedItemBinding объекта DataGridComboBoxColumn со свойством объекта ItemSrid объекта DataGrid. Затем привяжите свой 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>

ViewModel:

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));
        }
    }
}
...