2

私のアプリケーションの 1 つを WinForms から変換して WPF の学習に取り組んでいます。次のことを行う WPF の方法は何ですか?

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

新しい DataTable テーブルがフィルター処理された後、バインディング ソースを DataGrid に割り当てる必要があります。

更新 2 以下を追加しました

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

指定されたデータテーブルを 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>
4

1 に答える 1

5

データベースオブジェクト(またはそれらを取得する方法)をコレクション( MyCollection を ObservableCollection のTypeとして)またはコレクションビューソースにバインドしてから、それにバインドします。IN wpf xaml ビューがバインドされているクラスのコンテキストを操作する必要があります。したがって、データグリッドの直接のコンテキストがコード ビハインドである場合は、次の行をデータグリッドに追加してコレクションにバインドします。

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

win フォームでは、コレクションをコードで datagirid に割り当てることができますが、WPF では xaml でバインディングを宣言し、「WPF エンジン」が残りを処理します。少し学習曲線がありますが、非常に柔軟で、コードを削減できると思います。

しかし、これにより、アプリケーションのアーキテクチャに関するより大きな議論が発生します。モデル (データ)、ビュー (ユーザー インターフェイス)、および ViewModel (ビジネス ロジックを処理する) の間の関心の分離または分離を作成するために、MVVM を検討することをお勧めします。これにより、アプリケーションの保守とテストが容易になります。

編集 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 を検討する必要があると思います。

于 2013-11-06T03:23:13.507 に答える