Попытка связать данные с помощью списка ... что-то не так - PullRequest
0 голосов
/ 25 декабря 2011

Пожалуйста, помогите ... что я здесь не так делаю? Попытка связать список со списком данных. После отладки я вижу строки данных в таблице, но кое-что, как это не связано со списком.

FYI. _это имя моего текущего окна ...

            <ListBox Grid.Column="1" ItemsSource="{Binding ElementName=_this, Path=MainCategoriesTable}" HorizontalAlignment="Center" BorderBrush="Transparent" Background="Transparent" x:Name="lbMainCategories">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <RadioButton Grid.Column="0" Content="{Binding Path=main_category_name}" VerticalAlignment="Center" GroupName="grpMainCategory" x:Name="rdbEnableDisable" />
                            <Label Grid.Column="1" Width="30" Background="Transparent" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

Ниже находится свойство, которое пытается связать с ...

    public DataTable MainCategoriesTable
    {
        get { return _dtMainCategory; }
        set { _dtMainCategory = value; }
    }

Ответы [ 2 ]

0 голосов
/ 25 декабря 2011

DataTable работает как словарь, а не как объект.Он не отображает ваши столбцы как свойства, но каждый DataRow предоставляет индексатор , который можно использовать для получения значения ячейки.Поэтому вам нужно использовать синтаксис индексатора:

<RadioButton Grid.Column="0" Content="{Binding Path=[main_category_name]}" VerticalAlignment="Center" GroupName="grpMainCategory" x:Name="rdbEnableDisable" />

ОБНОВЛЕНИЕ

Еще одна вещь, которая меня беспокоит, это то, что ваше свойство MainCategoriesTable не уведомляет об изменениях.Если он изменился после того, как все Bindings были инициализированы, он не будет работать (в то время как DependencyProperty будет работать, потому что он всегда уведомляет об изменениях).Чтобы это работало, ваш контекстный класс должен реализовывать интерфейс INotifyPropertyChanged, а ваше свойство должно выглядеть так:

public DataTable MainCategoriesTable
{
    get { return _dtMainCategory; }
    set
    {
      if(value == _dtMainCategory)
      {
        return;
      }

      _dtMainCategory = value;
      var h = this.PropertyChanged;
      if(h != null)
      {
        h(this, new PropertyChangedEventArgs("MainCategoriesTable"));
      }
    }
}
0 голосов
/ 25 декабря 2011

Для XAML, чтобы установить контекст данных для кодирования, это то, что мне подходит

  DataContext="{Binding RelativeSource={RelativeSource Self}}"

в коде позади

  this.DataContext = this;

Но я использовал _this, как вы использовали его успешно.

Set Presentation.Trace = High во всей привязке XAML. Это не точный синтаксис, но если вы начнете с презентации, это должно быть очевидно.

Почему нет ярлыка на этикетке.

main_category_name является публичной собственностью? Я заметил, что это в нижнем регистре.

...