2016-12-22 8 views
0

В моем проекте wpf у меня есть datagrid, который заполняется набором данных и содержит несколько столбцов и много строк. Я хочу выполнить итерацию в столбце [1] Строки [i] (например, получить значения внутри ячеек столбца [1] для всех строк в datagrid). Мой вопрос: Как связать значение этих ячеек с одним текстовым полем? Я знаю, что использование множественного переплетения было бы одним из способов достижения решения, но я не нашел никакой помощи в отношении многосвязывания текстового поля через datagrid. Например, я прочитал следующие вопросы:Связать значение нескольких ячеек из столбца datagrid в одно текстовое поле

How to bind multiple values to a single WPF TextBlock?

How to use a MultiBinding on DataGridTextColumn?

Кроме того, связывание одного значения достижимо, и я уже сделал это. Буду признателен за любую помощь. Заранее спасибо !!

Мой XAML:

<DataGrid x:Name="datagridbatch" 
      FontSize="13.333" FontWeight="Normal" 
      IsReadOnly="True" 
      SelectionChanged="datagridbatch_SelectionChanged" 
      SelectionUnit="FullRow" SelectionMode="Single" 
      VerticalAlignment="Top" HorizontalAlignment="Right" 
      Height="615" Width="373" Margin="0,0,0,-582" 
      CanUserResizeColumns="False" CanUserResizeRows="False" 
      CanUserDeleteRows="False" CanUserAddRows="False" 
      RowHeight="30" 
      Grid.Row="5" Grid.Column="1" 
      CanUserReorderColumns="False" CanUserSortColumns="False" 
      ColumnHeaderHeight="25" ColumnWidth="*" 
      ScrollViewer.CanContentScroll="True" 
      ScrollViewer.VerticalScrollBarVisibility="Auto" /> 
<TextBox x:Name="input2" 
     Margin="0,0,0,0" Width="490" Height="30" 
     Grid.Row="0" Grid.Column="1" 
     HorizontalAlignment="Left" 
     Background="{DynamicResource {x:Static SystemColors.ControlLightLightBrushKey}}" 
     FontSize="13.333" FontWeight="Normal" 
     Text="{Binding SelectedItem.UNIQUEPART_ID, ElementName=datagridbatch}" 
     BorderBrush="{DynamicResource {x:Static SystemColors.ControlLightLightBrushKey}}" 
     FontFamily="Tahoma" 
     IsReadOnlyCaretVisible="True" 
     HorizontalScrollBarVisibility="Auto" 
     ScrollViewer.CanContentScroll="True"/> 
+0

вы можете использовать преобразователь при назначении текста в TextBox, в преобразователе можно вернуть значение, основанное на SelectedItem сетки. Можете ли вы попробовать таким образом? Пожалуйста, проигнорируйте, если вы уже пробовали. –

+0

Просьба указать «несколько значений ячейки». Вы хотите создать текст из __all rows__, из __selected rows__ или из какого-либо другого подмножества возможных значений? – grek40

+0

@ grek40 извините, я отредактировал вопрос.Мне действительно нужны значения из ячеек выбранных строк и указанного столбца (может быть от 1 до 10000), но мне все они нужны. I, а затем использовать их в качестве входных параметров для запроса. – Zak29

ответ

0

Идея использует нормальный Binding с преобразователем, который обрабатывает коллекцию элементов. Использование MultiBinding действительно не работает для динамического набора элементов источника привязки. Так Что нужно:

  • A DataGrid с пунктами, где каждый элемент содержит определенное свойство
  • TextBox
  • Binding на TextBox.Text собственности, где SelectedItems от DataGrid будут связаны с преобразователем, чтобы создать один текст
  • A Converter, который берет коллекцию предметов и создает строку из свойств объекта
  • Некоторая логика обновления t о обеспечить обновленный текст, когда выбранные элементы обновления

Давайте начнем с XAML, это может быть довольно просто:

<Window.Resources> 
    <local:ItemsToTextConverter x:Key="cItemsToTextConverter"/> 
</Window.Resources> 

<!-- your surrounding controls --> 

<DataGrid x:Name="datagridbatch" SelectionChanged="datagridbatch_SelectionChanged"/> 
<TextBox x:Name="input2" Text="{Binding ElementName=datagridbatch,Path=SelectedItems,Converter={StaticResource cItemsToTextConverter},Mode=OneWay}"/> 

Обратите внимание, что переплетные работы только один путь - его не так легко распространять значение строки возвращается к нескольким элементам, так как это сжатие элементов в одну строку.

Преобразователь должен взять коллекцию пунктов и извлечь строку из свойства:

public class ItemsToTextConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var items = value as IEnumerable; 
     if (items != null) 
     { 
      // note: items may contain the InsertRow item, which is of different type than the existing items. 
      // so the items collection needs to be filtered for existing items before casting and reading the property 
      var items2 = items.Cast<object>(); 
      var items3 = items2.Where(x => x is MyItemType).Cast<MyItemType>(); 
      return string.Join(Environment.NewLine, items3.Select(x => x.UNIQUEPART_ID)); 
     } 
     return string.Empty; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new InvalidOperationException(); 
    } 
} 

Кроме того, DataGrid.SelectedItems не будет автоматически срабатывает обновление привязки, при изменении выбора, так что вам нужно, чтобы вызвать руководство обновление в обработчик события изменения выбора:

void datagridbatch_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var binding = BindingOperations.GetBindingExpression(input2, TextBox.TextProperty); 
    if (binding != null) 
    { 
     binding.UpdateTarget(); 
    } 
} 
+0

У меня есть несколько вопросов относительно этих кодовых строк: var items2 = items.Cast (); var items3 = items2.Where (x => x is MyItemType) .Cast (); return string.Join (Environment.NewLine, items3.Select (x => x.UNIQUEPART_ID)); Вопрос 1sr: что вы подразумеваете под элементами, может содержать элемент InsertRow, который имеет другой тип, чем существующие элементы. 2. Вы фильтруете коллекцию предметов в вышеупомянутых строках? если да, можете ли вы, пожалуйста, уточнить? 3rd: Что делает ** MyItemType ** в кодедии: MyItemType) .Cast (); – Zak29

+0

(1) 'DataGrid.SelectedItems' может содержать специальный элемент, который позволяет создавать новую строку данных и имеет специальный тип. Поэтому, даже если все ваши элементы ввода имеют тип 'MyItemType' (сделанный так, потому что вы никогда не сказали нам имя типа для данных внутри вашего« DataGrid »), вы не можете предположить, что все элементы в' SelectedItems' имеют этот тип , Вот почему я фильтрую элементы по типу перед литьем. Метод 'Where' доступен в' IEnumerable ', но не в' IEnumerable', поэтому я сначала применил все элементы к 'object'. Можете написать больше объяснений, когда Рождество закончится;) – grek40