c# - WPF 绑定(bind)源

标签 c# wpf c#-4.0

通过将我的一个应用程序从 WinForms 转换过来来学习 WPF 执行以下操作的 WPF 方法是什么

 DataTable _current = _connections.Copy();
 BindingSource _bs = new BindingSource();
 bs.DataSource = _current;
 bs.Filter = "Client = '" + _selectedClient + "'";

过滤掉新的 DataTable 表后,我需要将绑定(bind)源分配给 DataGrid。

更新 2 我添加了以下内容

 public ObservableCollection<SupportConnectionData> _supportConnections = new ObservableCollection<SupportConnectionData>();

将给定的datatable转成ObservableCollection

 DataTable _dt = Global.RequestSupportConnections(_token);
                _dt = Crypto.DecryptDataTable(_dt);
                ObservableCollection<SupportConnectionData> _connections = new ObservableCollection<SupportConnectionData>();

                foreach (DataRow _row in _dt.Rows)
                {
                    SupportConnectionData _supportConnection = new SupportConnectionData()
                    {
                        _client = _row["Client"].ToString(),
                        _server = _row["Server"].ToString(),
                        _user = _row["User"].ToString(),
                        _connected = _row["Connected"].ToString(),
                        _disconnected = _row["Disconnected"].ToString(),
                        _reason = _row["Reason"].ToString(),
                        _caseNumber = _row["CaseNumber"].ToString()
                    };
                    _connections.Add(_supportConnection);
                }

                //let me assign new collection to bound collection
                App.Current.Dispatcher.BeginInvoke((Action)(() => { _supportConnections = _connections; }));
                //this allows it to update changes to ui
                dgSupportConnections.Dispatcher.BeginInvoke((Action)(() => { dgSupportConnections.DataContext = _supportConnections; }));

XAML

  <DataGrid x:Name="dgSupportConnections" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" AutoGenerateColumns="False" ItemsSource="{Binding}">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Client" Binding="{Binding _client}"/>
                        <DataGridTextColumn Header="Server" Binding="{Binding _server}"/>
                        <DataGridTextColumn Header="User" Binding="{Binding _user}"/>
                        <DataGridTextColumn Header="Connected" Binding="{Binding _connected}"/>
                        <DataGridTextColumn Header="Disconnected" Binding="{Binding _disconnected}"/>
                        <DataGridTextColumn Header="Reason" Binding="{Binding _reason}"/>
                        <DataGridTextColumn Header="Case Number" Binding="{Binding _caseNumber}"/>
                    </DataGrid.Columns>
                </DataGrid>

最佳答案

将您的数据库对象(或者您获取它们的方式)放入一个集合(比如 MyCollection 为 Type 的 ObservableCollection)或 Collection View 源,然后绑定(bind)到它。在 wpf 中,您必须使用 xaml View 绑定(bind)到的类的上下文。因此,如果数据网格的直接上下文是后面的代码,那么您可以将此行添加到数据网格以绑定(bind)到集合:

<DataGrid ItemsSource="{Binding MyCollection}" / >

在 win 窗体中,您可以在代码中将集合分配给 datagirid,但在 WPF 中,您在 xaml 中声明绑定(bind),“WPF 引擎”负责其余的工作。有一点学习曲线,但它非常灵活,在我看来减少了代码。

但这会引发关于您的应用程序架构的更大范围的讨论。我建议查看 MVVM,以在模型(您的数据)、 View (用户界面)和 ViewModel(处理您的业务逻辑)之间创建关注点解耦或分离。这将使您的应用程序更易于维护和测试。

编辑 1:示例

窗口的xaml:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid x:Name="MyDataGrid" AutoGenerateColumns="True" ItemsSource="{Binding MyObjectCollection}" DataContext="{Binding}"  />
    </Grid>
</Window>

Xaml 窗口背后的代码:

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Collections.ObjectModel;

class MainWindow
{


    public ObservableCollection<MyObject> MyObjectCollection = new ObservableCollection<MyObject>();

    public MainWindow()
    {
        // This call is required by the designer.
        InitializeComponent();

        // Add any initialization after the InitializeComponent() call.
        for (i = 1; i <= 10; i++) {
            MyObject newObject = new MyObject {
                age = i,
                name = "Full Name"
            };
            MyObjectCollection.Add(newObject);
        }


        MyDataGrid.ItemsSource = MyObjectCollection;
    }
}

public class MyObject
{
    public string name { get; set; }
    public string age { get; set; }
}

虽然此示例适用于学习,但我不建议将此方法用于生产应用程序。我认为您需要研究 MVVM 或 MVC,以便拥有可维护和可测试的应用程序。

关于c# - WPF 绑定(bind)源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19803199/

相关文章:

c# - 这实际上如何重新排序列表中的项目?

C# WPF 限制 ListView 中每行的项目

wpf - Visual Studio 2012 : Remote Debugging Monitor (MSVSMON. EXE) 似乎没有在远程计算机上运行

linq-to-sql - Linq 到 SQL : Left joining a grouped set makes a Cross Apply/Outer Apply

linq - 将iQueryable转换为IEnumerable

c# - 如何制作等同于@Ajax.DropDownList?

c# - Blazor Preview 9 Razor 布局中记录器的问题

c# - Windows 7 和我的 C# 程序中的复制问题

mysql - 防火墙后面的.NET SQL 查询身份验证

c# - 在我的 C# Win 应用程序中打开 Windows 的计算器?