首页 > 解决方案 > 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>

标签: c#wpfxamlmvvm

解决方案


您可以直接绑定到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;
        }
     }
}

推荐阅读