我希望能够通过外部DataGrid
设置ComboBox
的当前所选行>单元格的值。
我所拥有的代码在setter部分工作正常,但无法使ComboBox
选中的值与网格值匹配 ...似乎我错过了一个映射。< / p>
这就是我所拥有的:
1-数据网格绑定到ObservableCollection<Object>
:
<DataGrid ItemsSource="{Binding}"
SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}, AncestorLevel=2},
Path=SelectedCounterparty, Mode=TwoWay}">
2- ObservableCollection<Object>
有一个我应该绑定到Combobox的属性(即Combobox选中的项应该取该属性值):
public CurrenciesEnum Ccy
{
get { return this._ccy; }
set
{
if (value != this._ccy)
{
this._ccy = value;
NotifyPropertyChanged("Ccy");
}
}
}
3- Combobox源是一个枚举:
public enum CurrenciesEnum { USD, JPY, HKD, EUR, AUD, NZD };
4- Combobox的当前映射:
<ObjectDataProvider x:Key="Currencies" MethodName="GetNames" ObjectType="{x:Type System:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="ConfigManager:CurrenciesEnum" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<ComboBox ItemsSource="{Binding Source={StaticResource Currencies}}" SelectedItem="{Binding Ccy, Mode=TwoWay}"/>
什么有效:能够通过ComboBox设置网格中当前所选项目的“Ccy”属性。
什么没有:当更改行(并默认为USD或之前选择的值)时,ComboBox所选项目与网格中当前所选项目不匹配,换句话说不是好像被束缚了。关于如何解决这个问题的任何想法
答案 0 :(得分:0)
假设您已将ObservalbeCollection<MyDataGridItem> MyDataGridItems
绑定到datagrid ItemsSource
属性。
在view model
中定义一个属性,以绑定数据网格的SeletedItem
,如下所示。
private MyDataGridItem SelectedDataGridRow;
public MyDataGridItem SelectedDataGridRow
{
get
{
return selectedDataGridRow;
}
set
{
selectedDataGridRow= value;
NotifyPropertyChanged("SelectedDataGridRow");
}
}
假设您要绑定到DataGrid列的属性是MyColumn
(MyColumn是MyDataGridItem
类的属性)
然后在Ccy属性的setter方法中,按如下所示设置MyColumn属性。
public CurrenciesEnum Ccy
{
get { return this._ccy; }
set
{
if (value != this._ccy)
{
this._ccy = value;
//This is the code you need to implement
this.MyDataGridItems
.Where(item=> item== this.SelectedDataGridRow)
.First()
.MyColumn = value;
NotifyPropertyChanged("Ccy");
}
}
}
答案 1 :(得分:0)
终于找到了问题。
这是因为ComboBox SelectedItems返回一个字符串(CSharp Corner: Binding an Enum to a ComboBox),我绑定到Enum本身。
所以为了解决这个问题,我已经定义了一个转换器并在我的绑定中使用它:
<强>转换器:强>
[ValueConversion(typeof(string), typeof(Object))]
public class StringToCurrencyEnumConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value!=null)
{
CurrenciesEnum enumValue = (CurrenciesEnum)value;
return enumValue;
}
return null;
}
public object ConvertBack(object value, Type targetTypes, object parameter, CultureInfo culture)
{
if (value != null)
{
string temp = ((CurrenciesEnum) value).ToString();
return temp;
}
return null;
}
}
更新了绑定:
<Grid.Resources>
<local:StringToCurrencyEnumConverter x:Key="StringToCcyEnum" />
</Grid.Resources>
<ComboBox
ItemsSource="{Binding Source={StaticResource Currencies}}"
SelectedValue="{Binding Spc1Ccy, Mode=TwoWay, Converter={StaticResource StringToCcyEnum}}"/>