无法强制转换MS.Internal.NamedObject

时间:2017-02-13 13:07:57

标签: c# wpf data-binding

<DataGrid x:Name="DisplayRecipeGrid" AutoGenerateColumns="False" CanUserAddRows="false" ItemsSource="{Binding ModuleRecipeCatalog}"   VerticalContentAlignment="Center" IsReadOnly="True">
    <!---->
                                            <DataGrid.RowStyle>
                                                <Style TargetType="{x:Type DataGridRow}">
                                                    <EventSetter Event="MouseDoubleClick" Handler="EditRecipe_Executed"></EventSetter>
                                                </Style>
                                            </DataGrid.RowStyle>
                                            <DataGrid.Columns>
            <DataGrid x:Name="DisplayRecipeGrid" AutoGenerateColumns="False" CanUserAddRows="false" ItemsSource="{Binding ModuleRecipeCatalog}"   VerticalContentAlignment="Center" IsReadOnly="True"><!---->
    <DataGrid.RowStyle>
        <Style TargetType="{x:Type DataGridRow}">
            <EventSetter Event="MouseDoubleClick" Handler="EditRecipe_Executed"></EventSetter>
        </Style>
    </DataGrid.RowStyle>
    </DataGrid.Columns>
</DataGrid>

使用CanUserAddRows =“false”后,当我操作数据时出现错误,表明无法强制转换MS.Internal.NamedObject。

尝试以下方法,它有效。

if (obj.GetType().ToString() != "MS.Internal.NamedObject")
    return this.Equals(obj as RecipeBase);
else
    return false;

任何人都可以有其他方法吗?

1 个答案:

答案 0 :(得分:2)

  

任何人都可以有其他方法吗?

您应该使用as运算符并检查结果以确定转换是否成功:

RecipeBase x = obj as RecipeBase;
if(x == null)
    return false;

return Equals(x);

然后不需要将对象类型的字符串表示与“MS.Internal.NamedObject”进行比较。

如果您仍然出于某种奇怪的原因想要这样做,那么与System.Windows.Data.CollectionView.NewItemPlaceholder常数进行比较可能更好:

if(!(obj is System.Windows.Data.CollectionView.NewItemPlaceholder))