0

在我的 wpf 项目中,我有一个由数据集填充的数据网格,其中包含一些列和许多行。我想遍历 Column[1] Rows[i] (例如,获取 datagrid 中所有行的 column[1] 单元格内的值)。我的问题是如何将这些单元格值绑定到单个文本框?我知道使用多重绑定将是实现解决方案的方法之一,但我没有找到任何关于通过数据网格多重绑定文本框的帮助。例如,我已阅读以下问题:

如何将多个值绑定到单个 WPF TextBlock?

如何在 DataGridTextColumn 上使用 MultiBinding?

此外,绑定单个值是可以实现的,我已经做到了。我将不胜感激任何帮助。提前致谢 !!

我的 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"/>
4

1 回答 1

0

Binding这个想法是使用带有处理项目集合的转换器的法线。对于绑定源项的动态集合,使用 aMultiBinding并不能真正奏效。所以需要什么:

  • A DataGridwith items,其中每个项目都包含一个特定的属性
  • 一个TextBox
  • Binding属性上的A TextBox.Text,其中SelectedItemsfromDataGrid与转换器绑定以创建单个文本
  • AConverter接受一个项目集合并从项目属性创建一个字符串
  • 当所选项目更新时,一些更新逻辑可确保更新文本

让我们从 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}"/>

请注意,绑定仅以一种方式起作用 - 将字符串值分配回多个项目不像将项目压缩成单个字符串那么容易。

Converter 需要获取一个项目集合并从属性中提取一个字符串:

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

Also, DataGrid.SelectedItemswill not automatically fire a binding update, when the selection changes, so you need to trigger a manual update in the selection change event handler:

void datagridbatch_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var binding = BindingOperations.GetBindingExpression(input2, TextBox.TextProperty);
    if (binding != null)
    {
        binding.UpdateTarget();
    }
}
于 2016-12-22T10:47:39.717 回答