UWP DataGridComboBoxColumn изменяет значения строк при изменении выделения - PullRequest
0 голосов
/ 16 декабря 2018

Я работаю над проектом, в котором мне нужно выбрать значение из списка объектов, а затем обновить другие значения, отображаемые в той же строке, на основе сделанного выбора, со свойствами выбранного объекта.Я связываю список в моей виртуальной машине (используя Prism) с DataGridComboBoxColumn и работает нормально, но нет события SelectionChanged, к которому я могу привязаться.Я на самом деле использую RadDataGrid от Telerik, мой код:

<telerikGrid:RadDataGrid x:Name="ArticlesDataGrid" Margin="0,8,0,0"
                                 ItemsSource="{x:Bind MasterMenuItem.Articles, Mode=TwoWay}" UserEditMode="Inline" UserGroupMode="Disabled" AutoGenerateColumns="False">
        <telerikGrid:RadDataGrid.Columns>
            <telerikGrid:DataGridComboBoxColumn PropertyName="Code" ItemsSource="{x:Bind ViewModel.Articles}" DisplayMemberPath="Code" SelectedValuePath="Code" />
            <telerikGrid:DataGridComboBoxColumn PropertyName="Description" ItemsSource="{x:Bind ViewModel.Articles}" DisplayMemberPath="Description" SelectedValuePath="Description" />
            <telerikGrid:DataGridTextColumn PropertyName="MeasureUnit.Description" CanUserEdit="False" />
            <telerikGrid:DataGridTextColumn PropertyName="VatCode.Description" CanUserEdit="False"/>
            <telerikGrid:DataGridTextColumn PropertyName="Price" CanUserEdit="False"/>
            <telerikGrid:DataGridTextColumn PropertyName="Quantity" />
            <telerikGrid:DataGridTextColumn PropertyName="Total" CanUserEdit="False" />
        </telerikGrid:RadDataGrid.Columns>
    </telerikGrid:RadDataGrid>

Мне нужно, чтобы при изменении столбцов Description или Code я мог обновлять содержимое в других столбцах той же строки.Может кто-нибудь направить меня в правильном направлении?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Вместо обработки события вы можете реализовать свою логику в установщиках свойств Description и Code, например:

private string _description;
public string Description
{
    get { return _description; }
    set
    {
        SetProperty(ref _description, value);
        //your "selection changed" logic goes here...
    }
}

Как предполагает @Xavier Xie, класс, в котором *Свойства 1006 *, Code, Price, Quantity и т. Д. Определены, должны реализовывать интерфейс INotifyPropertyChanged и выдавать уведомления об изменениях для автоматического обновления представления.Пожалуйста, обратитесь к MSDN для получения дополнительной информации об этом.

Поскольку вы используете Prism, вы можете наследовать от Prism.Mvvm.BindableBase и вызывать метод SetProperty<T> для установки и выдачи уведомления об изменениях.за недвижимость.

0 голосов
/ 17 декабря 2018

Вам не нужно событие SelectionChanged.Вам просто нужно, чтобы ваш класс модели реализовал интерфейс INotifyPropertyChanged , когда значение DataGridComboBoxColumn изменилось, значение свойства объекта модели также будет изменено.Затем вы можете изменить в нем значение других свойств.

Поскольку вы не предоставили свой код с выделенным кодом, поэтому я просто сделаю простой пример кода для справки:

<telerikGrid:RadDataGrid x:Name="ArticlesDataGrid" Margin="0,8,0,0"
                             ItemsSource="{x:Bind ViewModel}" UserEditMode="Inline" UserGroupMode="Disabled" AutoGenerateColumns="False" >
        <telerikGrid:RadDataGrid.Columns>
            <telerikGrid:DataGridComboBoxColumn PropertyName="Option" ItemsSourcePath="Options" />
            <telerikGrid:DataGridTextColumn PropertyName="Total" CanUserEdit="False" />
        </telerikGrid:RadDataGrid.Columns>
    </telerikGrid:RadDataGrid>
public class Test : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string PropertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
        }
    }

    private int _Total;
    public int Total
    {
        get { return _Total; }
        set
        {
            if (_Total != value)
            {
                _Total = value;
                RaisePropertyChanged("Total");
            }
        }
    }

    private string _Option;
    public string Option
    {
        get { return _Option; }
        set
        {
            if (_Option != value)
            {
                _Option = value;
                switch (value)
                {
                    case "option1":this.Total = 1;break;
                    case "option2": this.Total = 2;break;
                    default: this.Total = 0;break;
                }
                RaisePropertyChanged("Option");
            }
        }
    }

    public ObservableCollection<string> Options { get; set;}
}
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        ViewModel = new ObservableCollection<Test>();
        ViewModel.Add(new Test() {Total=0,Options=new ObservableCollection<string>() {"--","option1","option2" } });
        ViewModel.Add(new Test() { Total = 0, Options = new ObservableCollection<string>() {"--" ,"option1", "option2" } });
    }

    public ObservableCollection<Test> ViewModel { get; set; }
}
...