WPF将控件绑定到DataView

时间:2013-03-18 18:35:52

标签: wpf binding

我在尝试将控件绑定到数据源时遇到了很多麻烦。我尝试绑定到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是我的MainWindow上的TextBlock。

在VB项目中,我可以中断我的代码并查询立即窗口中的特定数据列,并且存在正确的值。它只是不会更新到我的控件中。

这似乎是一件非常简单的事情。我是WPF的新手,看不出我的代码有什么问题。最终我想在我的XAML中定义绑定,但无法弄清楚如何执行此操作。此时,绑定的代码隐藏设置就可以了。我将有许多控件绑定到许多数据列。

有人能告诉我这里有什么明显的东西吗?

1 个答案:

答案 0 :(得分:2)

根据the documentationPropertyPath类的语法只接受C#风格的索引器。

  

立即对象上的单个索引器作为数据上下文:

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

该类无法根据调用语言更改其语法。


修改
要在代码隐藏中创建DataView时在XAML中设置绑定,请将视图公开为属性:

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]}"