通过将我的一个应用程序从 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/