Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 要从DataGrid中作废的命令参数_C#_Wpf_Xaml - Fatal编程技术网

C# 要从DataGrid中作废的命令参数

C# 要从DataGrid中作废的命令参数,c#,wpf,xaml,C#,Wpf,Xaml,我有一个包含多个列的datagrid。其中一个是idObiektu。我想将idObiektu(从所选行)作为命令的参数传递 在我看来 <Button Content="Usun" Command="{Binding UsunCommand}" CommandParameter="{Binding idObiektu}" /> <DataGrid.Columns> <DataGridTextColumn Header="Identy

我有一个包含多个列的datagrid。其中一个是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 + ";");
        }

公共字符串idObiektu
{
得到
{
返回idObiektu;
}
设置
{
如果(_idObiektu!=值)
{
_idObiektu=值;
OnPropertyChanged(()=>idObiektu);
}
}
}
public ICommand UsunCommand{get{返回新的RelayCommand(OnEdit);}
私有void OnEdit(string itemToEdit)
{
int idObiektu=Int32.Parse(itemToEdit);
atmaEntites.Database.ExecuteSqlCommand(“updateobiekty SET stan='2',其中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 + ";");
            }
        }
public ICommand UsunCommand{get{返回新的RelayCommand(OnEdit);}
私有void OnEdit(对象itemToEdit)
{
字符串o=itemToEdit.ToString();
如果(itemToEdit为空)
{
字符串idObiektu=itemToEdit.ToString();
atmaEntites.Database.ExecuteSqlCommand(“updateobiekty SET stan='2',其中idObiektu=“+idObiektu+”;”;
}
其他的
{
字符串idObiektu=itemToEdit.ToString();
atmaEntites.Database.ExecuteSqlCommand(“updateobiekty SET stan='2',其中idObiektu=“+idObiektu+”;”;
}
}

在视图中,我将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 + ";");
}
public ICommand UsunCommand{get{返回新的RelayCommand(OnEdit);}
私有void-OnEdit(ObiektyForAllViews-itemToEdit)
{
int idObiektu=itemToEdit.idObiektu;
atmaEntites.Database.ExecuteSqlCommand(“updateobiekty SET stan='2',其中idObiektu=“+idObiektu+”;”;
}

新答案。。。在重新阅读了这篇文章,但仍然一无所获之后,我发现了问题所在。您提到您想要所选行中的ID值,该值以前没有触发我的思维方式。这是我相信你所拥有的和需要的

为了在屏幕上显示记录列表,您可能需要

public List<YourRecordDataClassStructure> MyListOfNames {get; set;}
<DataGrid ItemsSource={Binding MyListOfNames} >
public YourRecordDataClassStructure JustOneItem {get; set;}
并将DataGrid绑定更新为

<DataGrid ItemsSource={Binding MyListOfNames} 
      SelectedItem={Binding JustOneItem} >
因此,在按钮中继命令的第一步,我明确地预先检查是否有从网格中选择的记录。如果什么都没有,出去。。。此外,如果记录的ID值为0,则忽略,因为如果没有要更新的ID,列表中甚至可能没有记录


HTH

绑定使用小写的
Binding idObiektu
,而属性名称是大写的
idObiektu
。您应该在Visual Studio的输出窗口中看到数据绑定错误消息。您没有将
itemToEdit
值传递给
RelayCommand
@Pavel,它是
RelayCommand
,因此,命令参数被转换为字符串,并自动传递给执行委托。@Clemens我尝试使用IdObiektu,但仍然不起作用,但IdObiektu和UsunCommand都是同一对象的属性,例如,行项类的实例?您需要向问题中添加更多的细节。您还可以考虑向视图模型中添加一个属性来保存所选的项目。然后,数据网格将被绑定到
SelectedItem=“{Binding SelectedObiektyForAllViews}”
和带有
CommandParameter=“{Binding SelectedObiektyForAllViews.idObierektu}”的按钮
-根据实际要用于idObierektu的类型,您可以在其中还原到
RelayCommand
RelayCommand
。当然int更合适。
<DataGrid ItemsSource={Binding MyListOfNames} 
      SelectedItem={Binding 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 + ";");
}