[英]Command parameter to void from 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 + ";");
}
我有問題,因為每次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 + ";");
}
}
在視圖中,我將 CommandParameter Binding 更改為
<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 + ";");
}
新答案......在重新閱讀帖子但仍然沒有任何進展后,我發現了什么。 您提到您想要選定行中的 ID 值,該值以前並未觸發我的思維定勢。 這是我相信你擁有的和需要的。
為了讓您的記錄列表顯示在您的屏幕上,您可能有類似的東西
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 + ";");
}
所以,按鈕中繼命令的第一步,我明確地預先檢查是否有從網格中選擇的記錄。 如果什么都沒有,請退出...此外,如果記錄的 ID 值為 0,則忽略,因為如果沒有要更新的 ID,您甚至可能不會在列表中包含任何記錄。
HTH
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.