Параметр команды для аннулирования из DataGrid - PullRequest
0 голосов
/ 29 января 2020

У меня есть сетка данных с несколькими столбцами. Одним из них является idObiektu. Я хотел бы передать idObiektu (из выбранной строки) в качестве параметра команды

В представлении у меня есть

<Button Content="Usun" Command="{Binding UsunCommand}"  CommandParameter="{Binding idObiektu}" />

<DataGrid.Columns>
                <DataGridTextColumn Header="Identyfikator" Binding="{Binding idObiektu}"/>
                    <DataGridTextColumn Header="Nazwa obiektu" Binding="{Binding Nazwa}" />
                <DataGridTextColumn Header="Adres" Binding="{Binding Adres}"/>
                    <DataGridTextColumn Header="Pojemność obiektu" Binding="{Binding Pojemnosc}" />
                    <DataGridTextColumn Header="Osoba kontakotwa" Binding="{Binding OsobaKontaktowa}"/>
                    <DataGridTextColumn Header="Numer telefonu" Binding="{Binding Telefon}"/>
                    <DataGridTextColumn Header="Adres email" Binding="{Binding Email}"/>
                    <DataGridTextColumn Header="Notatki" Binding="{Binding Notatki}"/>
</DataGrid.Columns>

В представлении модели у меня есть

public string idObiektu
        {
            get
            {
                return _idObiektu;
            }
            set
            {
                if (_idObiektu != value)
                {
                    _idObiektu = value;
                    OnPropertyChanged(() => idObiektu);
                }

            }
        }

public ICommand UsunCommand { get { return new RelayCommand<string>(OnEdit); } }

        private void OnEdit(string itemToEdit)
        {

                int idObiektu = Int32.Parse(itemToEdit);
                atmaEntites.Database.ExecuteSqlCommand("UPDATE Obiekty SET stan = '2' WHERE idObiektu = " + idObiektu + ";");
        }

У меня проблема, так как каждый раз, когда itemToEdit равен нулю

Я пытаюсь изменить VievModel на это, а тестовая строка o равна NULL

public ICommand UsunCommand { get { return new RelayCommand<object>(OnEdit); } }

        private void OnEdit(object itemToEdit)
        {
            string o = itemToEdit.ToString();
            if (itemToEdit is null)
            {
                string idObiektu = itemToEdit.ToString(); ;
                atmaEntites.Database.ExecuteSqlCommand("UPDATE Obiekty SET stan = '2' WHERE idObiektu = " + idObiektu + ";");
            }
            else
            {
                string idObiektu = itemToEdit.ToString(); ;
                atmaEntites.Database.ExecuteSqlCommand("UPDATE Obiekty SET stan = '2' WHERE idObiektu = " + idObiektu + ";");
            }
        }

Ответы [ 2 ]

1 голос
/ 29 января 2020

В представлении я изменил привязку CommandParameter на

<Button Content="Usun" Command="{Binding UsunCommand}"
        CommandParameter="{Binding Path=SelectedItem, ElementName=dataGrid}"/>

В модели представления я изменил тип объекта на тип элемента в DataGrid

public ICommand UsunCommand { get { return new RelayCommand<ObiektyForAllViews>(OnEdit); } }

private void OnEdit(ObiektyForAllViews itemToEdit)
{
    int idObiektu = itemToEdit.idObiektu;
    atmaEntites.Database.ExecuteSqlCommand("UPDATE Obiekty SET stan = '2' WHERE idObiektu = " + idObiektu + ";");
}
0 голосов
/ 29 января 2020

Новый ответ ... после перечитывания поста и до сих пор нигде не получая, я нашел, что случилось. Вы упомянули, что хотели получить значение идентификатора из выбранной строки, которая ранее не вызывала у меня мышления. Вот то, что, как я полагаю, у вас есть и что нужно.

Для того, чтобы ваш список записей отображался на экране, у вас, вероятно, есть что-то вроде

public List<YourRecordDataClassStructure> MyListOfNames {get; set;}

Затем, где-то внутри вашего форма, вы заполняете этот список записей, как запрашивается из базы данных.

Поскольку в вашем сообщении не отображен компонент вида

<DataGrid . . . >

, я могу только предположить, что это было что-то как

<DataGrid ItemsSource={Binding MyListOfNames} >

Следующий шаг ... Создайте новое привязываемое свойство в вашей модели представления, чтобы представить ЕДИНСТВЕННЫЙ экземпляр вашей структуры данных для привязки к «SelectedItem», выбранному из сетки ... что-то например

public YourRecordDataClassStructure JustOneItem {get; set;}

и обновите привязку DataGrid как

<DataGrid ItemsSource={Binding MyListOfNames} 
      SelectedItem={Binding JustOneItem} >

Так что теперь ваша форма имеет сетку, привязанную к вашему списку записей. ТАКЖЕ будет обновляться, когда любая запись выбирается из сетки данных, помещает копию текущей записи в свойство "JustOneItem" в модели представления.

Теперь вы можете игнорировать параметр и тип объекта как строку поскольку модель представления фактически имеет всю запись и может извлечь из нее любые / все значения, обновив тело метода

private void OnEdit(string itemToEdit)
{
   // confirm the selected object from the DataGrid was bound and actually selected.
   // if not, get out.
   if (JustOneItem== null || JustOneItem.MyIdColumn == 0)
      return;

   // we now have the entire object, get the ID column directly from 
   // the entire record displayed
   var idObiektu = JustOneItem.idObiektu;

   atmaEntites.Database.ExecuteSqlCommand("UPDATE Obiekty SET stan = '2' WHERE idObiektu = " + idObiektu + ";");
}

Итак, первый шаг в команде ретрансляции кнопки, я явно предварительно проверяя, если в сетке была выбрана запись. Если ничего, выходите ... Кроме того, игнорируйте, если значение идентификатора записи было 0, поскольку у вас, вероятно, даже не было бы записи в списке без идентификатора, который нужно обновить.

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...