Datagrid值绑定到外部ComboBox

时间:2013-04-01 01:46:37

标签: c# wpf binding datagrid combobox

我希望能够通过外部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所选项目与网格中当前所选项目不匹配,换句话说不是好像被束缚了。关于如何解决这个问题的任何想法

2 个答案:

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