我在尝试将控件绑定到数据源时遇到了很多麻烦。我尝试绑定到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中定义绑定,但无法弄清楚如何执行此操作。此时,绑定的代码隐藏设置就可以了。我将有许多控件绑定到许多数据列。
有人能告诉我这里有什么明显的东西吗?
答案 0 :(得分:2)
根据the documentation,PropertyPath
类的语法只接受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]}"