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}"
/>
別のしわは、DisplayMemberPath
とSelectedValuePath
が同じである必要はないということです。 Data
に「ShoeSize」という列があり、その値を別のComboBox
に表示したいとします。だから私たちはそれを行うことができます。 Data
の行のユニークな識別子としてまだColumn
を使用していますが、他の列を表示するようにComboBox
に伝えることができます。
どのようにDataGridにデータを設定していますか? WPFでは、このような醜いものをする必要はありません。 DataGridにデータを格納するために使用しているアイテムに移動します。また、DataTemplate内のそのマルチバインディングは、推測のように見えます。あなたは、マルチバインディングがこれまで使われていたことは何もしていないようです。あなたはコンボボックスに何を入れていますか? –
DataTableを介してDataGridを塗りつぶしています。 DataTableのデータは、SQLiteデータベースのSelect文からのものです。 – RockGuitarist1
' DataTemplate>は、あなたが持っているものと同じことをする必要があります。 –