2009-11-10 5 views
1

У меня есть список DataItem.Пользовательские WPF привязки данных

DataItem имеет RowId, ColumnId и значение.

Эти данные фактически описывают содержимое определяемой пользователем «таблицы».

Теперь мне нужно привязать эти данные к datagrid таким образом, чтобы он представлял «таблицу». то есть значение DataItem Value должно отображаться в сетке, используя их RowId и ColumnId.

Любая помощь с этой проблемой связывания была бы высоко оценена.

ответ

1

Если вы хотите использовать привязку, вы будете нуждаться в ItemsControl, как ListBox и изменить его ItemsPanelTemplate использовать Grid. Если вы не знаете количество столбцов и строк, к сожалению, вам придется генерировать их вручную из кода. Или полностью реализовать свой собственный Panel.

Вот образец. Вам придется изменить все привязки из XPath, если ваша базовая модель не является XML.

<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 [email protected]}" /> 
       <Setter Property="Grid.Column" Value="{Binding [email protected]}" /> 
      </Style> 
     </ListBox.Resources> 

    </ListBox> 

</Window> 
0

ОК, это может быть не самый «идеальный» метод (я бы предпочел, чтобы это произошло в XAML), но вот что вам нужно для начала. Этот код начинается с списка, называемого Items, и Grid, объявленного с именем ItemsGrid.

 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.

МОФ Toolkit есть DataGrid, который я успешно используется в нескольких проектах: http://wpf.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=29117

Сторонние поставщики также производить simimlar сетки. Выдающимися, в определенном порядке, являются Xceed, Telerik, Infragistics и Syncfusion.

Надеюсь, что это поможет! Tim