2016-12-22 21 views
0

私のwpfプロジェクトでは、データセットによってデータが取り込まれ、いくつかの列と多数の行が含まれるデータグリッドがあります。 Column [1] Rows [i](たとえば、DataGrid内のすべての行について列[1]のセル内の値を取得する)を反復したいとします。 私の質問はどのように私はこれらのセルの値を単一のテキストボックスにバインドできますか?私はマルチバインディングを使用して解決策を達成する方法の1つであることは知っていますが、データグリッドを通してテキストボックスをマルチバインドすることに関しては何の助けも見つけていません。データグリッド列から複数のセル値を単一のテキストボックスにバインド

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

テキストボックスにテキストを割り当てるときにコンバーターを使用できます。コンバーターでは、グリッドの選択された項目に基づいて値を返すことができます。あなたはこの方法で試すことができますか?すでに試してみたら無視してください。 –

+0

「複数のセル値」を指定してください。 __all rows__、__selected rows__、または他のサブセットの可能な値からテキストを作成しますか? – grek40

+0

@ grek40申し訳ありませんが、私は質問を編集しました。私は実際には選択された行と指定された列のセルからの値が必要ですが(1から10000まであります)、それらのすべてが必要です。次に、それらをクエリの入力パラメータとして使用します。 – Zak29

答えて

0

アイデアは、アイテムのコレクションを扱うコンバータで通常のBindingを使用しています。 MultiBindingを使用しても、バインディングソース項目の動的コレクションでは実際には機能しません。だから、いただきまし必要:DataGridからSelectedItemsを作成するために、コンバータにバインドされているTextBox.Text財産、上の各項目は、特定のプロパティが含まれているアイテム、

  • TextBox
  • Binding

    • DataGrid単一のテキスト
    • アイテムコレクションを取得し、アイテムプロパティから文字列を作成するConverter
    • 更新ロジックt O選択した項目が

    は、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はMyItemType).Cast (); return string.Join(Environment.NewLine、items3.Select(x => x.UNIQUEPART_ID)); 1sr質問:アイテムには、既存のアイテムとは異なるタイプのInsertRowアイテムが含まれているとはどういう意味ですか? 2.上記の行でアイテムコレクションをフィルタリングしていますか?はいの場合は、詳細を教えてください。 3番目:** MyItemType **はコードラインで何をしますか:MyItemType).Cast (); – Zak29

    +0

    (1) 'DataGrid.SelectedItems'は新しいデータ行の作成を可能にする特殊な項目を含むことができ、特別な型を持ちます。したがって、すべての入力項目が 'MyItemType'型を持っていても(あなたが' DataGrid'内のデータの型名を教えてくれなかったので)、 'SelectedItems'内のすべての項目がその型を持つとは仮定できません。このため、キャストする前にアイテムを種類別にフィルタリングしています。 'Where'メソッドは' IEnumerable 'では利用可能ですが、' IEnumerable'では利用できませんので、まずすべてのアイテムを 'object'にキャストします。クリスマスが終わったときにもっと説明を書くことができます;) – grek40

    関連する問題