试图将数据表与列表框绑定...出了点问题

时间:2011-12-24 20:33:27

标签: wpf binding listbox datatable this

请帮忙......我在这里做错了什么?尝试将listbox绑定到datatable。在调试之后,我看到表中的数据行,但有些是如何不绑定到列表框。

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 :(得分:0)

对于XAML设置数据上下文tocode,这对我有用

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

中的代码

  this.DataContext = this;

但我使用了_this就像你已成功使用它一样。

在所有XAML绑定中设置Presentation.Trace = High。这不是确切的语法,但如果你从Presentation开始,它应该是显而易见的。

为什么标签上没有绑定。

main_category_name是公共属性?我注意到它是小写的。

答案 1 :(得分:0)

DataTable就像字典一样,不像对象。它不会将您的列公开为属性,但每个DataRow都会公开可用于获取单元格值的indexer。因此,您需要使用索引器语法:

<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"));
      }
    }
}