C# WPF MVVMLight 从文本框中的数据网格中获取选定项
C# WPF MVVMLight get selecteditem from datagrid in textbox
我在从 Datagrid selected row
获取值到文本框时遇到了很大的问题。
用户应该 select 一行,视图应该从特定文本框中的行获取值。用户可以在文本框内进行更改并更新数据库之后。在 Youtube 教程和 Google 上看了几个小时后,我仍然不知道如何才能达到目的(文本框中 selected 行的值)。请帮助我
下面是 View 和 ViewModel 的代码
用户控件:
<!--Database datagrid-->
<materialDesign:Card Margin="5">
<DataGrid x:Name="MachineDataGrid" AutoGenerateColumns="False" MaxHeight="750" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" ItemsSource="{Binding DataContext}">
<DataGrid.Columns>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgMachineID}" Binding="{Binding MachineID, Mode=TwoWay}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCustomerId}" Binding="{Binding CustomerID}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCustomerName}" Binding="{Binding CustomerName}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCity}" Binding="{Binding City}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCountry}" Binding="{Binding Country}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgSpindleC1}" Binding="{Binding SpindleC1}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgSpindleC2}" Binding="{Binding SpindleC2}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgHoningHead}" Binding="{Binding HoningHead}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgNCVersion}" Binding="{Binding NCVersion}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgHMIVersion}" Binding="{Binding HMIVersion}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgHRIVersion}" Binding="{Binding HRIVersion}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgAHSVersion}" Binding="{Binding AHSVersion}"/>
</DataGrid.Columns>
</DataGrid>
</materialDesign:Card>
视图模型:
//Operation button for save, update, delete and print
public ICommand SaveCommand { get; private set; }
public ICommand UpdateCommand { get; private set; }
public ICommand DeleteCommand { get; private set; }
public ICommand PrintCommand { get; private set; }
public ICommand ShowAdvCommand { get; private set; }
public ObservableCollection<Machine> DataContext { get; set; }
public Machine MachineSelectedItem { get; set; }
public object MachineDataGrid { get; private set; }
//Datagrid string
//PRWContext for general use
private PRWContext context = new PRWContext();
public MachineViewModel()
{
//Commands for save, update, delete and print
SaveCommand = new RelayCommand(() => ExecuteSaveCommand());
UpdateCommand = new RelayCommand(() => ExecuteUpdateCommand());
DeleteCommand = new RelayCommand(() => ExecuteDeleteCommand());
PrintCommand = new RelayCommand(() => ExecutePrintCommand());
////Load the data from PRW Database to datagrid
LoadData();
}
private void ExecuteSaveCommand()
{
Machine machine = new Machine
{
//Machine data
MachineID = MachineID,
CustomerID = CustomerID,
CustomerName = CustomerName,
City = City,
Country = Country,
//Serial data
SpindleC1 = SpindleC1,
SpindleC2 = SpindleC2,
HoningHead = HoningHead,
//Softwareversion data
NCVersion = NCVersion,
HMIVersion = HMIVersion,
HRIVersion = HRIVersion,
AHSVersion = AHSVersion
};
context.Machines.Add(machine);
context.SaveChanges();
ClearText();
}
private void ExecuteUpdateCommand()
{
Machine machine = context.Machines.FirstOrDefault(w => w.MachineID == MachineID);
machine.CustomerID = CustomerID;
machine.CustomerName = CustomerName;
context.SaveChanges();
ClearText();
}
private void ExecuteDeleteCommand()
{
throw new NotImplementedException();
}
private void ExecutePrintCommand()
{
throw new NotImplementedException();
}
//Load data from database to grid
private void LoadData()
{
context.Machines.Load();
this.DataContext = context.Machines.Local;
}
//Clear textboxes
private void ClearText()
{
MachineID = string.Empty;
CustomerID = string.Empty;
CustomerName = string.Empty;
City = string.Empty;
Country = string.Empty;
SpindleC1 = string.Empty;
SpindleC2 = string.Empty;
HoningHead = string.Empty;
NCVersion = string.Empty;
HMIVersion = string.Empty;
HRIVersion = string.Empty;
AHSVersion = string.Empty;
}
我尝试使用 eventrigger for selectionchanged 命令和我在其他问题中看到的几种不同方式来做到这一点,但我很不走运:(
我认为您遗漏了获得所选项目所需要做的事情的一小部分。
正如您所做的那样,您需要(在您的 XAML 代码中)将您的 DataGrid 绑定到您的 ItemSource。而且,您可以使用 属性 SelectdItem
所以,您最终会得到如下所示的内容:(我刚刚包含了重要的部分)
<DataGrid ItemsSource="{Binding DataContext}" SelectedItem="{Binding Path=MachineSelectedItem }"/>
您可以获得进一步的解释 on this existent answer 但我所说的内容应该可以解决问题 ;)
几个小时前我发现我的代码有问题; )
我必须在我的 ViewModel 中插入以下代码:
private Machine machineSelectedItem;
public Machine MachineSelectedItem
{
get { return machineSelectedItem; }
set { machineSelectedItem = value; OnPropertyChanged(); }
}
选择命令已更改:
public ICommand SelectionChangedCommand { get; set; }` SelectionChangedCommand = new RelayCommand(() => ExecuteSelectionChangedCommand());` private void ExecuteSelectionChangedCommand()
{
**MachineID = machineSelectedItem.MachineID ? .ToString() ?? "";
CustomerID = machineSelectedItem.CustomerID ? .ToString() ?? "";**
}
并在视图中:
<DataGrid x:Name="MachineDataGrid" AutoGenerateColumns="False" MaxHeight="750" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" ItemsSource="{Binding DataContext, Mode=TwoWay}" SelectedItem="{Binding Path=MachineSelectedItem, Mode=TwoWay}">
<ie:Interaction.Triggers>
<ie:EventTrigger EventName="SelectionChanged">
<ie:InvokeCommandAction Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding ElementName=MachineDataGrid, Path=SelectedItem}"/>
</ie:EventTrigger>
</ie:Interaction.Triggers>
这完成了我需要的工作。也许这是一个丑陋的解决方案,但我暂时不在乎。
我在从 Datagrid selected row
获取值到文本框时遇到了很大的问题。
用户应该 select 一行,视图应该从特定文本框中的行获取值。用户可以在文本框内进行更改并更新数据库之后。在 Youtube 教程和 Google 上看了几个小时后,我仍然不知道如何才能达到目的(文本框中 selected 行的值)。请帮助我
下面是 View 和 ViewModel 的代码
用户控件:
<!--Database datagrid-->
<materialDesign:Card Margin="5">
<DataGrid x:Name="MachineDataGrid" AutoGenerateColumns="False" MaxHeight="750" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" ItemsSource="{Binding DataContext}">
<DataGrid.Columns>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgMachineID}" Binding="{Binding MachineID, Mode=TwoWay}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCustomerId}" Binding="{Binding CustomerID}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCustomerName}" Binding="{Binding CustomerName}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCity}" Binding="{Binding City}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCountry}" Binding="{Binding Country}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgSpindleC1}" Binding="{Binding SpindleC1}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgSpindleC2}" Binding="{Binding SpindleC2}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgHoningHead}" Binding="{Binding HoningHead}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgNCVersion}" Binding="{Binding NCVersion}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgHMIVersion}" Binding="{Binding HMIVersion}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgHRIVersion}" Binding="{Binding HRIVersion}"/>
<materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgAHSVersion}" Binding="{Binding AHSVersion}"/>
</DataGrid.Columns>
</DataGrid>
</materialDesign:Card>
视图模型:
//Operation button for save, update, delete and print
public ICommand SaveCommand { get; private set; }
public ICommand UpdateCommand { get; private set; }
public ICommand DeleteCommand { get; private set; }
public ICommand PrintCommand { get; private set; }
public ICommand ShowAdvCommand { get; private set; }
public ObservableCollection<Machine> DataContext { get; set; }
public Machine MachineSelectedItem { get; set; }
public object MachineDataGrid { get; private set; }
//Datagrid string
//PRWContext for general use
private PRWContext context = new PRWContext();
public MachineViewModel()
{
//Commands for save, update, delete and print
SaveCommand = new RelayCommand(() => ExecuteSaveCommand());
UpdateCommand = new RelayCommand(() => ExecuteUpdateCommand());
DeleteCommand = new RelayCommand(() => ExecuteDeleteCommand());
PrintCommand = new RelayCommand(() => ExecutePrintCommand());
////Load the data from PRW Database to datagrid
LoadData();
}
private void ExecuteSaveCommand()
{
Machine machine = new Machine
{
//Machine data
MachineID = MachineID,
CustomerID = CustomerID,
CustomerName = CustomerName,
City = City,
Country = Country,
//Serial data
SpindleC1 = SpindleC1,
SpindleC2 = SpindleC2,
HoningHead = HoningHead,
//Softwareversion data
NCVersion = NCVersion,
HMIVersion = HMIVersion,
HRIVersion = HRIVersion,
AHSVersion = AHSVersion
};
context.Machines.Add(machine);
context.SaveChanges();
ClearText();
}
private void ExecuteUpdateCommand()
{
Machine machine = context.Machines.FirstOrDefault(w => w.MachineID == MachineID);
machine.CustomerID = CustomerID;
machine.CustomerName = CustomerName;
context.SaveChanges();
ClearText();
}
private void ExecuteDeleteCommand()
{
throw new NotImplementedException();
}
private void ExecutePrintCommand()
{
throw new NotImplementedException();
}
//Load data from database to grid
private void LoadData()
{
context.Machines.Load();
this.DataContext = context.Machines.Local;
}
//Clear textboxes
private void ClearText()
{
MachineID = string.Empty;
CustomerID = string.Empty;
CustomerName = string.Empty;
City = string.Empty;
Country = string.Empty;
SpindleC1 = string.Empty;
SpindleC2 = string.Empty;
HoningHead = string.Empty;
NCVersion = string.Empty;
HMIVersion = string.Empty;
HRIVersion = string.Empty;
AHSVersion = string.Empty;
}
我尝试使用 eventrigger for selectionchanged 命令和我在其他问题中看到的几种不同方式来做到这一点,但我很不走运:(
我认为您遗漏了获得所选项目所需要做的事情的一小部分。
正如您所做的那样,您需要(在您的 XAML 代码中)将您的 DataGrid 绑定到您的 ItemSource。而且,您可以使用 属性 SelectdItem
所以,您最终会得到如下所示的内容:(我刚刚包含了重要的部分)
<DataGrid ItemsSource="{Binding DataContext}" SelectedItem="{Binding Path=MachineSelectedItem }"/>
您可以获得进一步的解释 on this existent answer 但我所说的内容应该可以解决问题 ;)
几个小时前我发现我的代码有问题; ) 我必须在我的 ViewModel 中插入以下代码:
private Machine machineSelectedItem;
public Machine MachineSelectedItem
{
get { return machineSelectedItem; }
set { machineSelectedItem = value; OnPropertyChanged(); }
}
选择命令已更改:
public ICommand SelectionChangedCommand { get; set; }` SelectionChangedCommand = new RelayCommand(() => ExecuteSelectionChangedCommand());` private void ExecuteSelectionChangedCommand()
{
**MachineID = machineSelectedItem.MachineID ? .ToString() ?? "";
CustomerID = machineSelectedItem.CustomerID ? .ToString() ?? "";**
}
并在视图中:
<DataGrid x:Name="MachineDataGrid" AutoGenerateColumns="False" MaxHeight="750" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" ItemsSource="{Binding DataContext, Mode=TwoWay}" SelectedItem="{Binding Path=MachineSelectedItem, Mode=TwoWay}">
<ie:Interaction.Triggers>
<ie:EventTrigger EventName="SelectionChanged">
<ie:InvokeCommandAction Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding ElementName=MachineDataGrid, Path=SelectedItem}"/>
</ie:EventTrigger>
</ie:Interaction.Triggers>
这完成了我需要的工作。也许这是一个丑陋的解决方案,但我暂时不在乎。