将UserControl依赖项属性绑定到运行时数据集

时间:2013-01-06 18:54:55

标签: c# .net wpf xaml data-binding

我对xaml很新。我已经看了很多,我发现的帖子接近我正在尝试的内容,但我找不到我正在寻找的内容。

我有一个带有依赖属性的外部WPF UserControl。在另一个项目中,我从UserControl库中导入了dll。我在我的项目中创建了一个静态网格,其中每个单元格中都有一个usercontrol实例。我定义的每个UserControl DependencyProperty都可以在xaml中找到。

在运行时,我将使用数据填充DataTable,然后我需要将网格中的UserControls绑定到DataTable,以便每个UserControl都反映DataTable中的值。 DataTable中的每一行都有几个列值,我需要绑定到UserControl的依赖项属性。

我遇到的问题是在检索数据之后定义DataContext,以便我可以在每个UserControls中为Dependency属性定义绑定路径。如果我将我的网格的DataContext设置为DataTable,如下所示:

Grid.DataContext = myDataTable;

那么UserControl属性的绑定路径的语法是什么?

<my:ucControl Name="myUserControl1" MyDependencyProp="{Binding Path=??}" Grid.Column="1" Grid.Row="1" />

我见过一些帖子,其中一些人使用过“Row [0] [column_name]”或其变体,但我似乎无法得到类似的工作。我接近绑定方法错了吗?

这是我的UserControl代码:

 public partial class ucControl : UserControl, INotifyPropertyChanged
 {

    public event PropertyChangedEventHandler PropertyChanged;

    public static DependencyProperty IndexProperty =
        DependencyProperty.Register("Index", typeof(int), typeof(ucControl));


    public static DependencyProperty StatusProperty =
        DependencyProperty.Register("Status", typeof(String), typeof(ucControl),
        new PropertyMetadata(string.Empty, new       PropertyChangedCallback(NotifyPropertyChanged)));


    #region PublicProperties

    public int Index
    {
        get { return (int)GetValue(IndexProperty); }
        set { SetValue(IndexProperty, value); }
    }

    public String Status
    {
        get { return (int)GetValue(StatusProperty); }
        set { SetValue(StatusProperty, value); }
    }

#endregion
}

这是XAML:

<Grid Canvas.Left="17" Canvas.Top="46" Name="MasterGrid" Width="1259" HorizontalAlignment="Left" VerticalAlignment="Top">
            <Grid.RowDefinitions>
            <RowDefinition Name="ColumnHeader" Height="25" />
            <RowDefinition Height="40" />
            <RowDefinition Height="40" />
            <RowDefinition Height="40" />
            </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Name="DateColumn" Width="80"/>
            <ColumnDefinition Width="65"/>
            <ColumnDefinition Width="65"/>
            <ColumnDefinition Width="65"/>
        </Grid.ColumnDefinitions>
            <my:ucControl Name="myControl1" Index="{Binding ??}" Status="{Binding ??}" Grid.Column="1" Grid.Row="1" Grid.RowSpan="1" />
            <my:ucControl Name="myControl2" Index="{Binding ??}" Status="{Binding ??}" Grid.Column="1" Grid.Row="2" Grid.RowSpan="1" />
            <my:ucControl Name="myControl3" Index="{Binding ??}" Status="{Binding ??}" Grid.Column="1" Grid.Row="2" Grid.RowSpan="1" />
        </Grid>

这是我的C#:

String strViewSelect = "SELECT index, status, FROM Table1 ORDER BY index ASC;
System.Data.DataSet dsMonthData = dataClass.mFillDataset(strViewSelect);

MasterGrid.DataContext = dsMonthData;

更新:以下是我解决这个问题的方法:

首先,我在项目中创建一个静态DataSource,其中包含我想要绑定的列。向查询添加参数,以便我可以指定要检索的数据。

以下内容已添加到我窗口的XAML中:

 <Window.Resources>
    <my1:myDataSet x:Key="myDataSet" />
    <CollectionViewSource x:Key="tableNameViewSource" Source="{Binding Path=tableName, Source={StaticResource myDataSet}}" />
</Window.Resources>

接下来,我将以下XAML添加到我的网格中:

DataContext="{StaticResource tableNameViewSource}"

现在,我可以将绑定添加到我的UserControl属性中:

Status="{Binding Path=statusColumn}"

<my:ucCalendarCell Name="ucControl1" Status="{Binding Path=statusColumnName}" Index="{Binding Path=indexColumnName}" Grid.Column="1" Grid.Row="1" Grid.RowSpan="1" />

还有一些工作可以满足我的需求,但这是基本的想法。我很肯定这不仅仅是一种方法,但这对我有用。

0 个答案:

没有答案