自定义WPF数据绑定

时间:2009-11-10 17:38:18

标签: wpf data-binding

我有一个DataItem列表。

DataItem有一个RowId,ColumnId和Value。

这些数据项基本上描述了用户可定义的“表”的内容。

现在我需要将这些数据绑定到数据网格,使其代表“表”。即,DataItem值应使用RowId和ColumnId显示在网格中。

非常感谢任何有关此绑定问题的帮助。

2 个答案:

答案 0 :(得分:1)

如果您想使用绑定,则需要ItemsControl,例如ListBox,并修改其ItemsPanelTemplate以使用Grid。如果您不知道列数和行数,遗憾的是您必须从代码中手动生成它们。或者完全实现自己的Panel

这是样本。如果基础模型不是XML,则必须从XPath更改所有绑定。

<Window x:Class="CoordBinding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <XmlDataProvider x:Key="_items">
            <x:XData>
                <Items xmlns="">
                    <Item ColId="1" RowId="2">Blah</Item>
                    <Item ColId="0" RowId="1">Doh</Item>
                    <Item ColId="2" RowId="0">Meh</Item>
                </Items>
            </x:XData>
        </XmlDataProvider>
    </Window.Resources>

    <ListBox ItemsSource="{Binding Source={StaticResource _items},XPath=Items/*}">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid IsItemsHost="True">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                </Grid>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>

        <ListBox.Resources>
            <Style TargetType="ListBoxItem">
                <Setter Property="Grid.Row" Value="{Binding XPath=@RowId}" />
                <Setter Property="Grid.Column" Value="{Binding XPath=@ColId}" />
            </Style>
        </ListBox.Resources>

    </ListBox>

</Window>

答案 1 :(得分:0)

好吧,这可能不是最“理想”的方法(我更喜欢在XAML中使用它),但这里有一些东西可以帮助你入门。此代码以名为Items的List和名为ItemsGrid的<_p>声明的Grid开头

        int maxRow = Items.Select(i => i.RowId).Max();
        int maxCol = Items.Select(i => i.ColumnId).Max();

        for (int i = 0; i <= maxRow; i++)
            ItemsGrid.RowDefinitions.Add(new RowDefinition());

        for (int i = 0; i <= maxCol; i++)
            ItemsGrid.ColumnDefinitions.Add(new ColumnDefinition());

        foreach (var item in Items)
        {
            TextBlock newItem = new TextBlock() { Text = item.Value };
            ItemsGrid.Children.Add(newItem);
            Grid.SetRow(newItem, item.RowId);
            Grid.SetColumn(newItem, item.ColumnId);
        }

或者,您可以查看实际的DataGrid控件,而不是现在在.NET Framework中使用的内容。

WPF工具包有一个我在几个项目中成功使用的DataGrid: http://wpf.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=29117

第三方供应商也生产simimlar网格。突出的是Xceed,Telerik,Infragistics和Syncfusion。没有特别的顺序。

希望有所帮助! 添