我要做的是将字符串从我的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。任何指导将不胜感激! :)
答案 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
显示其他列。