2013-03-18 3 views
1

У меня много проблем с попыткой привязать элементы управления к источнику данных. Я попробовал привязку к XML-документу. Это сработало, но было много проблем, когда я попытался обновить сам XML-документ и обновить его.WPF Управление привязкой к DataView

Моя самая новая попытка - привязать элементы управления к 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) 

И это не работает. Он не будет обновлять мой пользовательский интерфейс. В обоих случаях GetTable создает 1-строчный DataTable с образцами данных. В моем проекте VB tb является TextBlock на моем MainWindow.

В проекте VB я могу прервать свой код и запросить конкретный столбец данных в окне Immediate, и там будет правильное значение. Он просто не будет обновлять мой контроль.

Это похоже на очень простую вещь. Я новичок в WPF и не вижу, что не так с моим кодом. В конце концов, я хотел бы определить привязку в своем XAML, но не могу понять, как это сделать. На этом этапе настройка привязки кода будет нормально. У меня будет много элементов управления, которые будут привязаны ко многим столбцам данных.

Может ли кто-нибудь сказать мне, какую очевидную вещь мне здесь не хватает?

+0

Работает ли версия VB, если вы используете тот же путь свойств, что и C#? 'plcBinding.Path = New PropertyPath (" [0] [transportor_plc_data_Main_FeedCarousel_caroAngle] ")' –

+0

OMG, это глупо просто ??? В моей защите я подумал, что это правильный синтаксис VB, который обычно использует парсеры вместо скобок. – RMittelman

+0

Когда я запрашиваю значение в окне Immediate, скобки не работают:? PlcView [0] ["transportor_plc_data_Main_FeedCarousel_caroAngle"] Идентификатор ожидается. – RMittelman

ответ

2

Согласно the documentation, синтаксис для класса PropertyPath допускает только индексы C#.

Single индексатор на непосредственный объект в контексте данных:

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

Класс не имеет возможности изменить синтаксис на основе языка вызова.


EDIT
Чтобы установить привязки в 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]}" 
+0

Прежде чем я увидел это, я попробовал «Me.DataContext = plcView» в MainWindow_Initialized, затем «Text =» {Binding Path = [0] [transportor_plc_data_Main_FeedCarousel_caroAngle]} "" (без имени DataView) в XAML TextBox. Работает без объявления собственности. Все еще не может объявить DC в XAML, но это нормально. – RMittelman

+0

Теперь большой вопрос: могу ли я в коде удалить строку в plcView, а затем добавить новую строку 0 (с новыми значениями), и привязка автоматически приведет к обновлению всех значений? – RMittelman

+0

Я добавил свойство, потому что не был уверен, что у вас уже есть набор DataContext. Если вы измените данные в строке или замените строку, вам нужно поднять подходящее событие PropertyChanged для этого свойства. Попробуйте установить «DataContext» на «null», а затем обратно в «DefaultView». –

Смежные вопросы