将DataGrid中的数据提取到Binded Combobox中

时间:2016-10-13 13:34:34

标签: c# wpf data-binding combobox

我要做的是将字符串从我的DataGrid中的特定列中取出,并在Combobox.Text属性中显示该字符串。我正在使用此代码:

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

我已在此处放置一个断点以查看它正在拉动的内容,并且它是Combobox中作为项目包含的正确String,但每当我尝试通过Combobox.Text设置它时,Combobox为空。然而,我将我的Combobox设置为isEditable = True和ReadOnly = True并且此方法有效,但选择Collection中的项目将显示System.Data.DataRowView,因为Combobox被绑定到我的DataTable。我也将XAML添加到我的Combobox中:

<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}"/>

此方法适用于文本框和复选框,但似乎没有想到它为Comboboxes。任何指导将不胜感激! :)

1 个答案:

答案 0 :(得分:1)

在我看来,DataContext的{​​{1}}必须是ComboBox您用来填充DataTable的{​​{1}},因为DataGrid 。我假设它也是ItemsSource="{Binding}"的{​​{1}},并且您的目标是让DataContext选项反映所选行中的DataGrid ComboBox

DataGrid

如果您希望选择更改可以双向进行 - 那么对<DataGrid x:Name="dgvMain" ItemsSource="{Binding}" /> <ComboBox ItemsSource="{Binding}" DisplayMemberPath="Column" SelectedValuePath="Column" SelectedValue="{Binding SelectedItem.Row[Column], ElementName=dgvMain}" /> 选项的更改会更改ComboBox选项 - 这很简单:

DataGrid

这是一个更干净的方式来完成整个事情: 首先,在C#中编写一个viewmodel类。

<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}"
    />

然后使用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; } } 属性来跟踪&#34;列&#34;的选定值。两个控件。默认情况下,两个控件的SelectedColumnValue属性的绑定将是双向的,因为框架内容会使它成为那样(解释的方式是什么?)。因此,如果以编程方式更改SelectedValue,控件将更新,如果用户更改了网格选择,则将更新viewmodel属性,该属性将更新SelectedColumnValue - 反之亦然。

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不一样。假设我们有一个&#34; ShoeSize&#34; SelectedValuePath中的列,我们希望将这些值显示在另一个Data中。所以我们可以做到。我们仍然使用ComboBox作为Column中行的唯一标识符,但我们可以告诉Data显示其他列。