【问题标题】:What would be the equivalent of the following code in wpf?wpf中的以下代码等效于什么?
【发布时间】:2020-08-21 16:46:20
【问题描述】:

我正在做一个项目,我的基础是一个在 Windows 窗体中存在的项目,问题是在 WPF 中没有 DataGridView,只有 DataGrid,当我想选择一行时会产生问题修改它

  private void btnEditar_Click(object sender, EventArgs e)
    {
        if (dataGridView1.SelectedRows.Count > 0)
        {
            Editar = true;
            txtNombre.Text = dataGridView1.CurrentRow.Cells["Nombre"].Value.ToString();
            txtMarca.Text = dataGridView1.CurrentRow.Cells["Marca"].Value.ToString();
            txtDesc.Text = dataGridView1.CurrentRow.Cells["Descripcion"].Value.ToString();
            txtPrecio.Text = dataGridView1.CurrentRow.Cells["Precio"].Value.ToString();
            txtStock.Text = dataGridView1.CurrentRow.Cells["Stock"].Value.ToString();
            idProducto = dataGridView1.CurrentRow.Cells["Id"].Value.ToString();
        }
        else
            MessageBox.Show("seleccione una fila por favor");
    }

【问题讨论】:

  • 理想的方法是使用 MVVM 模式(为数据类型创建一个类,然后将其设为视图的 dataContext,然后在 xaml 中绑定属性)。为您提供真正等效的 wpf 代码将是一个糟糕的建议。

标签: c# wpf visual-studio


【解决方案1】:

这个问题的范围很大,“正确”的答案并不适合,所以这必然是对通常使用的方法的一次快速浏览。

如果你没有完全“明白” wpf 与 winforms 不同。 MVVM 的整个概念对于习惯于 winforms 开发的人来说是完全陌生的。

您绑定和数据模板,而不是在代码中传输数据,几乎每个团队都使用 MVVM。这是有充分理由的。

要将数据放入 wpf 数据网格,您通常会将其 itemssource 绑定到行视图模型的 observablecollection。视图模型“只是”一个实现 inotifypropertychanged 并且每列(或其他属性)具有公共属性的类。

它还可以公开 icommands。这些是单击事件处理程序的“做事”等价物。

略过一些东西,假设您有一个 StockLevelsView,它是一个关于您拥有的东西库存的窗口。这有一个数据网格来显示您的数据。 窗口的数据上下文将设置为 StockLevelsViewModel。除了其他可能具有公共属性 StockList 的东西之外,StockList 是 StockViewModel 的 observablecollection。 StockViewmodel 将具有 Nombre、Marca 等的公共属性。它与 Stock 表可能具有的 DTO 或实体框架模型非常相似。在 StockViewModel 中,您可以将数据属性用于验证和业务逻辑。你得到你的日期并将每个复制到一个 stockviewmodel 中。也许使用自动映射器。

这样你就有了一个充满数据的数据网格。

数据网格继承自 Selector https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.datagrid?view=netcore-3.1

正如这所暗示的,您可以在数据网格中选择一行,然后这将成为选定项。为此,您需要将 selectionmode 设置为 single。

Selecteditem 是一个依赖属性,这意味着您可以绑定它。因此,您可以将 selecteditem 绑定到 StocksViewModel 中的另一个公共属性。然后,在并排或重叠面板中,您可以将 datacontext 绑定到该属性。或者您可以将该数据上下文直接绑定到数据网格的选定项。

无论哪种方式,面板的数据上下文都会成为 StockViewModel 的选定项。然后,您可以在该面板中绑定 StockViewModel 的属性。也许他们都得到了一个文本框,并且它的文本属性绑定到该列。

用户编辑,然后你在持久化之前使用 inotifydataerrorinfo 进行验证。

标记概述:

 <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <DataGrid ItemsSource="{Binding StocksList}"
              Name="StocksDG"
              IsReadOnly="True"
              />
    <StackPanel Grid.Column="1"
                DataContext="{Binding SelectedItem, ElementName=StocksDG">
        <TextBlock Text="Nombre:"
        <TextBox Text="{Binding Nombre}"/>
            ....
    </StackPanel>
</Grid>

您选择左侧的一行,右侧的文本框绑定到该行的数据,因此 Nombre 等是可编辑的。

再次值得一提的是,所有视图模型都应始终实现 inotifypropertychanged。

https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification

您将需要使用诸如 prism mvvm 或 mvvmlight 之类的框架。如果除了代理命令或中继命令之外没有其他原因,您将需要 icommand 实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多