0

我希望能够DataGrid通过外部设置 a 的当前选定行>单元格的值ComboBox

我拥有的代码在 setter 部分工作正常,但无法使ComboBox所选值与网格值匹配......似乎我缺少映射。

这是我所拥有的:

1- Datagrid 绑定到ObservableCollection<Object>

<DataGrid ItemsSource="{Binding}" 
          SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}, AncestorLevel=2},
          Path=SelectedCounterparty, Mode=TwoWay}">

2-ObservableCollection<Object>有一个我应该绑定到组合框的属性(即组合框选定的项目应该采用该属性值):

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-组合框的当前映射:

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

工作原理:能够通过组合框设置网格中当前选定项的“Ccy”属性。

什么不: ComboBox 选定的项目在更改行时与网格中的当前选定项目不匹配(并且默认为 USD 或先前选择的值),换句话说,似乎没有正确绑定。关于如何解决这个问题的任何想法

4

2 回答 2

0

假设您已绑定ObservalbeCollection<MyDataGridItem> MyDataGridItems到 datagridItemsSource属性。

在 中定义一个属性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");
        }
    }
}
于 2013-04-01T05:43:20.457 回答
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}}"/>
于 2013-04-01T10:43:26.810 回答