1

コントロールをデータソースにバインドしようとすると、多くの問題が発生します。XMLドキュメントにバインドしてみました。それは機能しましたが、XMLドキュメント自体を更新してUIを更新しようとすると、多くの問題が発生しました。

私の最新の試みは、コントロールをDataViewにバインドすることです。これは簡単に思えます。StackOverflowで見つけたサンプルアプリがあります。これは次のことを行います。

    public MainWindow()
    {

        InitializeComponent();

        DataTable dataTable = GetTable();
        Binding dataTableBinding = new Binding();
        dataTableBinding.Source = dataTable;
        dataTableBinding.Path = new PropertyPath("Rows[0][MyTextColumn]");
        txtMyTextColumnDataTable.SetBinding(TextBox.TextProperty, dataTableBinding);

        DataView dataView = dataTable.DefaultView;
        Binding dataViewBinding = new Binding();
        dataViewBinding.Source = dataView;
        dataViewBinding.Path = new PropertyPath("[0][MyTextColumn]");
        txtMyTextColumnDataView.SetBinding(TextBox.TextProperty, dataViewBinding);
    }

これは、箱から出してすぐに完全に機能します。コードがデータテーブルの値を更新するボタンを追加しました。そのボタンをクリックすると、テキストボックスに新しい値がすぐに反映されます。

次のように、VB.Netプロジェクトでこれを試しました。

    dim plcData As DataTable = GetTable()
    dim plcView As DataView = plcData.DefaultView
    dim plcBinding As Binding = New Binding
    plcBinding.Source = plcView
    plcBinding.Path = New PropertyPath("(0)(conveyor_plc_data_Main_FeedCarousel_caroAngle)")
    Me.tb.SetBinding(TextBlock.TextProperty, plcBinding)

そして、それは機能しません。UIコントロールは更新されません。どちらの場合も、GetTableはサンプルデータを使用して1行のDataTableを作成します。私のVBプロジェクトでは、tbはメインウィンドウのTextBlockです。

VBプロジェクトでは、コードを中断して、イミディエイトウィンドウの特定のデータ列にクエリを実行できます。適切な値がそこにあります。それは私のコントロールに更新されません。

これは非常に簡単なことのようです。私はWPFにまったく慣れていないので、コードの何が問題になっているのかわかりません。最終的に、XAMLでバインディングを定義したいのですが、これを行う方法がわかりません。この時点で、バインディングのコードビハインド設定は問題ありません。多くのデータ列にバインドするための多くのコントロールがあります。

私がここで見逃している明らかなことを誰かに教えてもらえますか?

4

1 に答える 1

2

ドキュメントによると、クラスの構文PropertyPathはC#スタイルのインデクサーのみを受け入れます。

データコンテキストとしてのイミディエイトオブジェクトの単一インデクサー:

<Binding Path="[key]" .../>

クラスには、呼び出し元の言語に基づいて構文を変更する方法がありません。


編集コードビハインドで作成された
ときにXAMLでバインディングを設定するには、ビューをプロパティとして公開します。DataView

public static readonly DependencyProperty plcViewProperty 
   = DependencyProperty.Register("plcView", typeof(System.Data.DataView), 
   typeof(MainWindow), new PropertyMetadata(null));

public System.Data.DataView plcView
{
   get { return (System.Data.DataView)GetValue(plcViewProperty); }
   set { SetValue(plcViewProperty, value); }
}

private void MainWindow_Initialized(object sender, EventArgs eventArgs)
{
   plcView = GetTable().DefaultView;
}

次に、XAMLで:

<Window x:Name="TheWindow" ...>
   ...
   Text="{Binding ElementName=TheWindow,
      Path=plcView[0][conveyor_plc_data_Main_FeedCarousel_caroAngle]}"
于 2013-03-18T19:27:38.143 に答える