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

时间:2013-12-16 17:18:05

标签: c# wpf

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

我的代码:

查看模型:

        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()”函数?

2 个答案:

答案 0 :(得分:1)

首先,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}" />

答案 1 :(得分:0)

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)