2016-10-13 8 views
0

私がやっていることは、DataGridの特定の列から文字列を取り出し、その文字列をCombobox.Textプロパティに表示することです。私はそうするように、このコードを使用しています:DataGridからBinded Comboboxへのデータの抽出

var dataString = ((DataRowView)dgvMain.SelectedItem).Row["Column"].ToString(); 

を私はそれが引いたものを見るために、このにブレークポイントを置いてきた、そしてそれはコンボボックスに項目として含まれている正しい文字列でしたが、私がしようとするたびにCombobox.Text経由で設定するには、Comboboxは空です。しかし、私はコンボボックスをisEditable = TrueとReadOnly = Trueに設定していますが、このメソッドは機能しますが、コレクション内の項目を選択すると、DataTableにバインドされているため、System.Data.DataRowViewが表示されます。

<ComboBox x:Name="cboAlarmType" HorizontalAlignment="Left" Margin="138,256,0,0" VerticalAlignment="Top" Width="320" TabIndex="5" 
       BorderBrush="Black" Background="White" ItemsSource="{Binding}" DisplayMemberPath="AlarmName" SelectedValuePath="AlarmName" 
       SelectedValue="{Binding Row.Column, ElementName=dgvMain}"/> 

この方法は、テキストボックスやチェックボックスで動作しますが、コンボボックスのためにそれを把握するように見えたしていない:私も私のコンボボックスにXAMLを追加します。どんな指導もいただければ幸いです! :)

+0

どのようにDataGridにデータを設定していますか? WPFでは、このような醜いものをする必要はありません。 DataGridにデータを格納するために使用しているアイテムに移動します。また、DataTemplate内のそのマルチバインディングは、推測のように見えます。あなたは、マルチバインディングがこれまで使われていたことは何もしていないようです。あなたはコンボボックスに何を入れていますか? –

+0

DataTableを介してDataGridを塗りつぶしています。 DataTableのデータは、SQLiteデータベースのSelect文からのものです。 – RockGuitarist1

+0

'は、あなたが持っているものと同じことをする必要があります。 –

答えて

1

ComboBoxのためのあなたのDataContextはあなたがItemsSource="{Binding}"ので、DataGridを移入するために使用しているDataTableでなければならないように私には見えます。 DataGridの場合はDataContextとし、の選択された行がComboBoxの選択に反映されることを目標としています。

<DataGrid 
    x:Name="dgvMain" 
    ItemsSource="{Binding}" 
    /> 
<ComboBox 
    ItemsSource="{Binding}" 
    DisplayMemberPath="Column" 
    SelectedValuePath="Column" 
    SelectedValue="{Binding SelectedItem.Row[Column], ElementName=dgvMain}" 
    /> 

あなたは両方の方法を行くことを選択の変更を希望した場合 - そうComboBox選択範囲の変更はDataGrid選択を変更する - それは簡単です:

<DataGrid 
    x:Name="dgvMain" 
    ItemsSource="{Binding}" 
    SelectedValuePath="Column" 
    SelectedValue="{Binding SelectedValue, ElementName=ColumnComboBox}" 
    /> 
<ComboBox 
    x:Name="ColumnComboBox" 
    ItemsSource="{Binding}" 
    DisplayMemberPath="Column" 
    SelectedValuePath="Column" 
    SelectedValue="{Binding SelectedItem.Row[Column], ElementName=dgvMain}" 
    /> 

そしてここでは、へのクリーンな方法です全体をやります: まず、C#でviewmodelクラスを作成します。

public class ViewModelbase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public class MyViewModel : ViewModelbase 
{ 
    public MyViewModel() 
    { 
     // I populated my DataTable with "Row 1", "Row 2", etc. 
     // Naturally you'd use a value from your own data. 
     SelectedColumnValue = "Row 2"; 
    } 

    #region SelectedColumnValue Property 
    private String _selectedColumnValue = default(String); 
    public String SelectedColumnValue 
    { 
     get { return _selectedColumnValue; } 
     set 
     { 
      if (value != _selectedColumnValue) 
      { 
       _selectedColumnValue = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 
    #endregion SelectedColumnValue Property 

    public DataTable Data { get; protected set; } 
} 

そして、両方のコントロールのための「列」の選択値を追跡することSelectedColumnValueプロパティを使用します。 2つのコントロールのSelectedValueプロパティのバインディングは、デフォルトでは双方向になります。そのようにするフレームワークの理由からです(説明はどうですか?)。したがって、SelectedColumnValueをプログラマチックに変更すると、コントロールが更新され、ユーザーがグリッド選択を変更すると、viewmodelプロパティが更新され、ComboBoxが更新されます。逆も同様です。

<DataGrid 
    ItemsSource="{Binding Data}" 
    SelectedValuePath="Column" 
    SelectedValue="{Binding SelectedColumnValue}" 
    /> 
<ComboBox 
    ItemsSource="{Binding Data}" 
    DisplayMemberPath="Column" 
    SelectedValuePath="Column" 
    SelectedValue="{Binding SelectedColumnValue}" 
    /> 
<ComboBox 
    ItemsSource="{Binding Data}" 
    DisplayMemberPath="ShoeSize" 
    SelectedValuePath="Column" 
    SelectedValue="{Binding SelectedColumnValue}" 
    /> 

別のしわは、DisplayMemberPathSelectedValuePathが同じである必要はないということです。 Dataに「ShoeSize」という列があり、その値を別のComboBoxに表示したいとします。だから私たちはそれを行うことができます。 Dataの行のユニークな識別子としてまだColumnを使用していますが、他の列を表示するようにComboBoxに伝えることができます。

+0

ありがとうございました!すべてのXAMLプロパティを1行に1つずつ保持するのがよい方法ですか、それとも単に優先しますか? – RockGuitarist1

+0

@ RockGuitarist1要素に2つ以上の属性がある場合、特にStackOverflowでは読みやすくなっています。読者には水平スクロールは難しい。 –

+0

おそらく良い考えです。私はこれを行うために8 Comboxesを持っているので、DataGridのXAMLで複数のSelectedValuePathsとSelectedValuesを持つ方法を調べなければなりません。 – RockGuitarist1

関連する問題