首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF BindingSource

WPF BindingSource
EN

Stack Overflow用户
提问于 2013-11-06 02:52:14
回答 1查看 15K关注 0票数 2

通过从WinForms转换我的一个应用程序来学习WPF -- WPF的方法是什么?

代码语言:javascript
复制
 DataTable _current = _connections.Copy();
 BindingSource _bs = new BindingSource();
 bs.DataSource = _current;
 bs.Filter = "Client = '" + _selectedClient + "'";

在对新的DataTable表进行过滤之后,我需要将绑定源分配给DataGrid。

更新2我添加了以下内容

代码语言:javascript
复制
 public ObservableCollection<SupportConnectionData> _supportConnections = new ObservableCollection<SupportConnectionData>();

将给定的数据表转换为ObservableCollection

代码语言:javascript
复制
 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

代码语言:javascript
复制
  <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>
EN

回答 1

Stack Overflow用户

发布于 2013-11-06 03:23:13

将数据库对象(或以何种方式获取它们)放入集合(例如MyCollection作为类型的ObservableCollection )或集合视图源,然后绑定到该集合中。在wpf中,您必须处理绑定xaml视图的类的上下文。因此,如果数据集的直接上下文是后面的代码,那么您可以将这一行添加到datagrid中,以便绑定到集合:

代码语言:javascript
复制
<DataGrid ItemsSource="{Binding MyCollection}" / >

在win forms中,您可以在代码中将集合分配给datagirid,但是在WPF中,您可以在xaml中声明绑定,而"WPF引擎“则负责其余的绑定。有一点学习曲线,但它确实是灵活的,在我看来,减少了代码。

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

编辑1:示例

窗口的xaml:

代码语言:javascript
复制
<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窗口后面的代码:

代码语言:javascript
复制
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,以便有一个可维护和可测试的应用程序。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19803199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档