【问题标题】:Datagridcombobox binding with expandoobjectDatagridcombobox 与 expandoobject 绑定
【发布时间】:2014-09-30 11:16:01
【问题描述】:

我正在尝试将 datagridcombobox 选定值绑定到 expando 对象中的属性值。但是,我无法做到这一点。也许任何人都可以给我一些关于这个问题的见解。

以下是代码的相关细节: XAML 数据网格

<DataGrid x:Name="RXSignalsDataGrid" Grid.Column="1" CanUserReorderColumns="True" CanUserAddRows="False" CanUserResizeColumns="True"
                          CanUserSortColumns="False" Margin="5" ItemsSource="{Binding CANRXFrameSignals}" AutoGenerateColumns="False">
  <DataGrid.Columns>
    <DataGridCheckBoxColumn Header="Enabled" Binding="{Binding Property_0_Value}" Width="Auto" IsReadOnly="False"/>
    <DataGridTextColumn Header="Start Bit" Binding="{Binding Property_2_Value}" Width="Auto" IsReadOnly="False"/>
    <DataGridTextColumn Header="Length" Binding="{Binding Property_5_Value}" Width="Auto" IsReadOnly="False"/>
    <DataGridCheckBoxColumn Header="Little Endian" Binding="{Binding Property_1_Value}" Width="Auto" IsReadOnly="False"/>
    <DataGridCheckBoxColumn Header="Conversion 1 Enabled" Binding="{Binding Property_4_Value}" Width="Auto" IsReadOnly="False"/>
    <DataGridTextColumn Header="Conversion 1 Type" Binding="{Binding Property_7_Value}" Width="Auto" IsReadOnly="False"/>
    <DataGridComboBoxColumn Header="Conversion 1 Type" Width="Auto" IsReadOnly="False" DisplayMemberPath="Key" SelectedValuePath="Value">
         <DataGridComboBoxColumn.ElementStyle>
            <Style>
               <Setter Property="ComboBox.ItemsSource" Value="{Binding Path=SignalConversionOperators}"/>
               <Setter Property="ComboBox.SelectedValue" Value="{Binding Path=CANRXFrameSignals.Property_7_Value}"/>
            </Style>
         </DataGridComboBoxColumn.ElementStyle>
         <DataGridComboBoxColumn.EditingElementStyle>
            <Style>
              <Setter Property="ComboBox.ItemsSource" Value="{Binding Path=SignalConversionOperators}"/>
              <Setter Property="ComboBox.SelectedValue" Value="{Binding Path=CANRXFrameSignals.Property_7_Value}"/>
            </Style>
         </DataGridComboBoxColumn.EditingElementStyle>
     </DataGridComboBoxColumn>
     <DataGridTextColumn Header="Conversion 1 Value" Binding="{Binding Property_8_Value}" Width="Auto" IsReadOnly="False"/>
     <DataGridCheckBoxColumn Header="Conversion 2 Enabled" Binding="{Binding Property_3_Value}" Width="Auto" IsReadOnly="False"/>
     <DataGridTextColumn Header="Conversion 2 Type" Binding="{Binding Property_6_Value}" Width="Auto" IsReadOnly="False"/>
     <DataGridTextColumn Header="Conversion 2 Value" Binding="{Binding Property_9_Value}" Width="Auto" IsReadOnly="False"/>
     <DataGridTextColumn Header="Variable" Binding="{Binding Property_10_Value}" Width="Auto" IsReadOnly="False"/>
  </DataGrid.Columns>
</DataGrid>

查看模型:

    private ObservableCollection<ExpandoObject> canRXFrameSignals;
    private Dictionary<string, uint> signalConversionOperators = new Dictionary<string, uint>(){
        {"+",0},
        {"-", 1},
        {"*", 2},
        {"/", 3},
        {"AND", 4},
        {"OR", 5},
        {"XOR", 6},
        {"Power", 7},
        {"S +", 8},
        {"S -", 9},
        {"S *", 10},
        {"S /", 11},
        {">>", 12},
    };

    public ObservableCollection<ExpandoObject> CANRXFrameSignals
    {
        get
        {
            return canRXFrameSignals;
        }
        private set
        {
            if (canRXFrameSignals == value)
            {
                return;
            }
            canRXFrameSignals = value;
            OnPropertyChanged("CANRXFrameSignals");
        }
    }

    public Dictionary<string, uint> SignalConversionOperators
    {
        get { return signalConversionOperators; }
    }

expando 对象属性中的数据是 uint 类型。我已经将字典绑定到组合框,这意味着当我单击组合框时我会获取元素,但是它不会将数值绑定到 ExpandoObject。但是 CheckBoxColumns 和 TextBoxColumns 中的值绑定成功,因此我有点困惑为什么它在 ComboBox 的情况下不绑定。

我得到的错误是:

A first chance exception of type 'System.InvalidOperationException' occurred in System.Core.dll
System.Windows.Data Error: 17 : Cannot get 'CANRXFrameSignals' value (type 'Object') from '' (type 'ExpandoObject'). BindingExpression:Path=CANRXFrameSignals.Property_7_Value; DataItem='ExpandoObject' (HashCode=8435281); target element is 'TextBlockComboBox' (Name=''); target property is 'SelectedValue' (type 'Object') InvalidOperationException:'System.InvalidOperationException: Property path is not valid. 'System.Dynamic.ExpandoObject+MetaExpando' does not have a public property named 'Items'.
       at CallSite.Target(Closure , CallSite , Object )
       at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
       at MS.Internal.DynamicPropertyAccessorImpl.GetValue(Object component)
       at MS.Internal.Data.PropertyPathWorker.GetValue(Object item, Int32 level)
       at MS.Internal.Data.PropertyPathWorker.RawValue(Int32 k)'

【问题讨论】:

    标签: c# wpf datagrid combobox expandoobject


    【解决方案1】:

    所以我自己发现了问题。这篇文章中描述的类似:Binding ItemsSource of a ComboBoxColumn in WPF DataGrid

    主要的缺陷是,虽然 ItemsSource 绑定的数据上下文在 datagridcombobox 中变得混乱,但 SelectedValueBinding 仍然保留在 Datagrid ItemsSource 中设置的默认数据上下文,因此在创建应使用 SelectedValueBinding 数据网格的原始 ItemsSource 内的相对路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-16
      • 2015-11-19
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 2012-11-17
      相关资源
      最近更新 更多