繁体   English   中英

如何绑定CommandParameter并在radgridview中获取选定的行ID

[英]How to bind CommandParameter and get selected row id in radgridview

我想在表格中点击按钮来修改行。

它是我的代码:

查看模型:

        public class PrzeszukiwanieBazyViewModel : INotifyPropertyChanged
    {
        private ModelBazyDanych _modelBazy;
        private IList<EwidencjonowanaRzecz> _ewidencjaList;
        private String _test;

        public string Test
        {
            get { return _test; }
            set
            {
                if (value == _test) return;
                _test = value;
                OnPropertyChanged();
            }
        }

        public IList<EwidencjonowanaRzecz> EwidencjaList
        {
            get { return _ewidencjaList; }
            set
            {
                if (Equals(value, _ewidencjaList)) return;
                _ewidencjaList = value;
                OnPropertyChanged();
            }
        }


        public PrzeszukiwanieBazyViewModel(ModelBazyDanych pModelBazyDanych)
        {
            this._modelBazy = pModelBazyDanych;
            LocalizationManager.Manager = new Jezyk();
//            EwidencjaList = ModelBazy.SelectAllFromTable<EwidencjonowanaRzecz>().Where(m => m.Status == 0).ToList();
        }

        public ModelBazyDanych ModelBazy
        {
            get { return _modelBazy; }
            set
            {
                if (Equals(value, _modelBazy)) return;
                _modelBazy = value;
                OnPropertyChanged();
            }
        }

        private DelegateCommand _odswiezanieCommand;
        public ICommand OdswiezanieCommand
        {
            get
            {
                if (_odswiezanieCommand == null)
                    _odswiezanieCommand = new DelegateCommand(Odswiezanie);
                return _odswiezanieCommand;
            }
        }
        private DelegateCommand _wydajCommand;
        public ICommand WydajCommand
        {
            get
            {
                if (_wydajCommand == null)
                    _wydajCommand = new DelegateCommand(Wydaj);
                return _wydajCommand;
            }
        }

        private void Wydaj()
        {
            // HOW TO WRITE THIS ?:>
        }

        private void Odswiezanie()
        {
//            MessageBox.Show(Test);
            EwidencjaList = ModelBazy.SelectAllFromTable<EwidencjonowanaRzecz>().Where(m => m.Status == 0).ToList();
        }

        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

XAML:

   <controls:RadGridView 
                             Grid.Row="0"
                             x:Name="TableRadGridView"
                             ItemsSource="{Binding Source={StaticResource Locator}, Path=PrzeszukiwanieBazyViewModel.EwidencjaList}"
                             AutoGenerateColumns="False"
                             ColumnWidth="auto"
                             FilteringMode="Popup"
                             BorderThickness="0">
                    <controls:RadGridView.Columns>
                        <controls:GridViewDataColumn DataMemberBinding="{Binding Id}" Header="Id" />
                        <controls:GridViewDataColumn DataMemberBinding="{Binding Nazwa}" Header="Nazwa" />
                        <controls:GridViewDataColumn DataMemberBinding="{Binding Model}" Header="Model" />
                        <controls:GridViewDataColumn DataMemberBinding="{Binding Marka}" Header="Marka" />
                        <controls:GridViewDataColumn DataMemberBinding="{Binding WagaRef.WagaPrzedmiotu}" Header="Waga" />
                        <controls:GridViewDataColumn DataMemberBinding="{Binding KolorRef.Barwa}" Header="Kolor" />
                        <controls:GridViewDataColumn DataMemberBinding="{Binding GdzieZnaleziono}" Header="Gdzie znaleziono" />
                        <controls:GridViewDataColumn DataMemberBinding="{Binding KtoZnalazl}" Header="Kto znalazł" />

                        <controls:GridViewDataColumn DataMemberBinding="{Binding Marka}" Header="Uwagi" />
                        <controls:GridViewDataColumn DataMemberBinding="{Binding KategoriaRef.Nazwa}" Header="Kategoria" />
                        <controls:GridViewDataColumn DataMemberBinding="{Binding UserRef.Login}" Header="Dodane przez" />
                        <controls:GridViewDataColumn DataMemberBinding="{Binding Status}" Header="Status" />
                <controls:GridViewDataColumn Header="Wydaj">
                   <controls:GridViewDataColumn.CellTemplate>
                       <DataTemplate>
                            <controls:RadButton Content="Wydaj"
                                                Command="{Binding Source={StaticResource Locator},Path=PrzeszukiwanieBazyViewModel.WydajCommand}"
                                                CommandParameter="qwerty"></controls:RadButton>
                       </DataTemplate>
                   </controls:GridViewDataColumn.CellTemplate>
                </controls:GridViewDataColumn>


            </controls:RadGridView.Columns>
                </controls:RadGridView>

当我单击所选行中的按钮时,我想更改此记录中的“状态”字段。 我唯一要选择的行的想法是CommandParameter。 我该如何实现……? 如何在VM中编写“ Wydaj()”函数?

首先, ICommand.ExecuteCommand方法通常采用一个对象参数,因此其实现应如下所示:

private void Wydaj(object parameter)
{
    if (parameter as EwidencjonowanaRzecz != null)
        ((EwidencjonowanaRzecz)parameter).Status = "new status";
}

ICommand大多数实现,包括Telerik的DelegateCommand ,都可以让您直接在构造函数中传递它,因为它具有_wydajCommand = new DelegateCommand(Wydaj);

接下来,更新CommandParameter ,将其绑定到行数据:

<controls:RadButton Content="Wydaj"
                    Command="{Binding Source={StaticResource Locator},Path=PrzeszukiwanieBazyViewModel.WydajCommand}"
                    CommandParameter="{Binding}" />

有一个DelegateCommand的通用版本。 我假设您的CommandParameter是一个String,所以您可以像这样声明它

private DelegateCommand<String> _wydajCommand;
public ICommand WydajCommand
{
    get
    {
        if (_wydajCommand == null)
            _wydajCommand = new DelegateCommand<String>(Wydaj);
        return _wydajCommand;
    }
}

和执行处理程序功能可以是

private void Wydaj(String parameter)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM