C# 要从DataGrid中作废的命令参数
我有一个包含多个列的datagrid。其中一个是idObiektu。我想将idObiektu(从所选行)作为命令的参数传递 在我看来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
<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 + ";");
}