c# - wpf 和 mvvm 模式中的控制
问题描述
如何在 wpf 中设计一个控件,以便在单击更新按钮时焦点应该在特定行上并且应该显示相应的标签。请找到随附的屏幕截图!
DataGrid x:Name="dataEmployee" HorizontalAlignment="Left" Margin="76,71,0,0" IsReadOnly="True" VerticalAlignment="Top" Height="121" Width="305" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Employee Id" Binding="{Binding EmployeeId}"/>
<DataGridTextColumn Header="Employee Name" Binding="{Binding EmployeeName}"/>
<DataGridTextColumn Header="Salary" Binding="{Binding EmployeeSalary}"/>
<DataGridTextColumn Header="Designation" Binding="{Binding EmployeeDesignation}"/>
</DataGrid.Columns>
</DataGrid>
解决方案
您可以直接绑定到DataGrid
:
<StackPanel>
<DataGrid x:Name="dataEmployee" IsReadOnly="True" VerticalAlignment="Top" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Employee Id" Binding="{Binding EmployeeId}"/>
<DataGridTextColumn Header="Employee Name" Binding="{Binding EmployeeName}"/>
<DataGridTextColumn Header="Salary" Binding="{Binding EmployeeSalary}"/>
<DataGridTextColumn Header="Designation" Binding="{Binding EmployeeDesignation}"/>
</DataGrid.Columns>
</DataGrid>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Name"/>
<TextBox Text="{Binding ElementName=dataEmployee, Path=SelectedItem.EmployeeName}"/></StackPanel>
</StackPanel>
但是由于规范说你应该按下一个按钮,让我们也这样做:
XAML 几乎相同:
<StackPanel>
<DataGrid x:Name="dataEmployee" IsReadOnly="True" VerticalAlignment="Top" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Employee Id" Binding="{Binding EmployeeId}"/>
<DataGridTextColumn Header="Employee Name" Binding="{Binding EmployeeName}"/>
<DataGridTextColumn Header="Salary" Binding="{Binding EmployeeSalary}"/>
<DataGridTextColumn Header="Designation" Binding="{Binding EmployeeDesignation}"/>
</DataGrid.Columns>
</DataGrid>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Name"/>
<TextBox Name="currentEmployeeName"/></StackPanel>
<Button Height="30" Content="Update" Click="Button_Click"/>
</StackPanel>
我创建了一个简单Class
的数据处理:
public class Employee
{
public string EmployeeId { get; set; }
public string EmployeeName { get; set; }
public string EmployeeSalary { get; set; }
public string EmployeeDesignation { get; set; }
}
其余部分并不难,但当然必须根据您的 DataModel 有所不同。重要的是Button_Click
事件:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
List<Employee> listEmployees = new List<Employee>();
listEmployees.Add(new Employee() { EmployeeName = "Bob" });
listEmployees.Add(new Employee() { EmployeeName = "Mary" });
listEmployees.Add(new Employee() { EmployeeName = "Kato" });
listEmployees.Add(new Employee() { EmployeeName = "Mohammed" });
dataEmployee.ItemsSource = listEmployees;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Employee currentEmployee = dataEmployee.SelectedItem as Employee;
if (currentEmployee == null)
{
currentEmployeeName.Text = "no selection";
}
else
{
currentEmployeeName.Text = currentEmployee.EmployeeName;
}
}
}
推荐阅读
- javascript - 判断 div 元素是否与 javascript 中的特定属性重叠的任何方法
- oauth-2.0 - Azure API 管理 - Oauth2 服务器配置是强制性的吗?
- python - 我可以获取 tensorflow lite 模型的指标吗?
- javascript - 为什么我会在一种情况下得到“在测试时,导致 React 状态更新的代码应该被包装到 act 中”,而不是另一种?
- state - xstate 中 { actions: "" } 和 { entry: "" } 之间的区别?
- python - 如何将字典列表插入现有项目
- php - 使用简单的 HTML dom 解析器提取带有内部文本的部分文本
- python - 具有递增后缀的多个变量的代码自动化
- c# - 如何将一串文本添加到另一个txt文件中
- java - JavaFX - 从控制器 2 传递到控制器 1 的变量在使用 System.out 检查时正确更新,但结果在标签字段中未更新