C# 如何强制转换XAML以访问子类属性

C# 如何强制转换XAML以访问子类属性,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,在我的项目中,我有一个单元的列表,它被用作DataGrid的数据源。Units类型有两种类型的子类,AUnits和BUnits。列表中的每个单元都是AUnit或BUnit。我的问题是,当我尝试绑定到一个子类单元类型的特定属性时,XAML看不到它,我只返回0。通常情况下,如果这是在C#中完成的,我只会将其强制转换并访问属性,但在代码中的这一点上我无法做到。绑定是在C#中创建的,如下所示: dgtc.Header = Properties.Resources.MaxPressure; dgtc.

在我的项目中,我有一个
单元的列表
,它被用作DataGrid的数据源。
Units
类型有两种类型的子类,
AUnits
BUnits
。列表中的每个
单元都是
AUnit
BUnit
。我的问题是,当我尝试绑定到一个子类单元类型的特定属性时,XAML看不到它,我只返回0。通常情况下,如果这是在C#中完成的,我只会将其强制转换并访问属性,但在代码中的这一点上我无法做到。绑定是在C#中创建的,如下所示:

 dgtc.Header = Properties.Resources.MaxPressure;
 dgtc.MinWidth = 25;
 dgtc.Width = Properties.Settings.Default.MaxPressureColumnWidth;
 dgtc.IsReadOnly = true;
 dgtc.Binding = new Binding("Unit.MaxDepthRelativeToEntry")
 {
     Converter = new DistanceUnitsConverter()
 };
其中dgtc是DataGridTextColumn。Unit.MaxDepthRelativeToEntry作为0通过,因为它是
AUnit
的子类上的一个属性,所以XAML认为我试图访问一个不存在的属性

我已经阅读并尝试了以下几种语法:

dgtc.Binding = new Binding("AUnit.MaxDepthRelativeToEntry")
dgtc.Binding = new Binding("Unit(MyNameSpace:AUnit).MaxDepthRelativeToEntry")
dgtc.Binding = new Binding("Unit(MyNameSpace:AUnit.MaxDepthRelativeToEntry)")
但这些都没能起作用。我也尝试过通过转换器来实现这一点,但问题是,在构建DataGrid/设置绑定等时,我没有可用的单元列表。因此,我无法从实例中获取属性并返回它。有人知道我有什么方法可以(最好是在XAML中)获得我绑定到的类型的子类类型的属性吗

编辑:

My DataGrid具有以下XAML:

<DataGrid x:Name="JobListView"
              AutoGenerateColumns="False"
              ItemsSource="{Binding UnitStatusCollection, Mode=TwoWay}"
              CanUserDeleteRows="False"
              Style="{StaticResource JobGridViewStyle}"
              SelectedItem="{Binding JobsListViewSelectedUnitInfo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
              Utility:DataGridColumnsBehavior.BindableColumns="{Binding DataGridColumns}"
              ContextMenu="{StaticResource ListViewContextMenu}"
              Margin="10,5,10,2"
              Grid.Row="2"
              SelectionMode="Single"
              SelectionUnit="FullRow"
              HorizontalAlignment="Stretch"
              HorizontalContentAlignment="Stretch"
              RowStyle="{StaticResource DataGridRowStyle}"
              CellStyle="{StaticResource DataGridCellStyle}"
              AlternationCount="2"
              HorizontalScrollBarVisibility="Visible"
              VerticalScrollBarVisibility="Visible"
              CanUserResizeRows="False"
              HorizontalGridLinesBrush="#d6d6d6"
              VerticalGridLinesBrush="#d6d6d6"
              Background="#EAEAEA"
              >


ItemsSource
被设置为
UnitStatusCollection
,这是一个名为
UnitInfo
的类的
observedcollection
,该类包含一个
Unit
和一个
UnitStatus
。我需要访问
UnitInfo
Unit
中的属性
MaxDepthRelativeToEntry
。但是我需要能够将
Unit
视为
AUnit
如果您绑定到
Unit
对象列表,那么
DataGridTextColumn
DataContext
应该是
AUnit
BUnit
对象本身,因此您的绑定路径应该是
新绑定(“MaxDepthRelativeToEntry”)

对于只存在于一个子类而不存在于其他子类上的属性,您可能会得到某种运行时警告,但它不应该引发异常

下面是一个快速的代码示例:

XAML:

<DataGrid x:Name="dgTest" AutoGenerateColumns="False" CanUserAddRows="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="A" Binding="{Binding A}" />
        <DataGridTextColumn Header="B" Binding="{Binding B}" />
        <DataGridTextColumn Header="C" Binding="{Binding C}" />
    </DataGrid.Columns>
</DataGrid>
输出:

如果我用代码隐藏而不是XAML编写绑定,其工作方式也完全相同:

colB.Binding = new Binding("B")

如果要绑定到
Unit
对象列表,则
DataGridTextColumn
DataContext
应该是
AUnit
BUnit
对象本身,因此绑定路径应该是
新绑定(“MaxDepthRelativeToEntry”)

对于只存在于一个子类而不存在于其他子类上的属性,您可能会得到某种运行时警告,但它不应该引发异常

下面是一个快速的代码示例:

XAML:

<DataGrid x:Name="dgTest" AutoGenerateColumns="False" CanUserAddRows="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="A" Binding="{Binding A}" />
        <DataGridTextColumn Header="B" Binding="{Binding B}" />
        <DataGridTextColumn Header="C" Binding="{Binding C}" />
    </DataGrid.Columns>
</DataGrid>
输出:

如果我用代码隐藏而不是XAML编写绑定,其工作方式也完全相同:

colB.Binding = new Binding("B")

我忽略了提到在我的单元周围有一个包装类,我的ItemsSource是在XAML中设置的,就像这样:
ItemsSource=“{Binding UnitStatusCollection,Mode=TwoWay}”
。我是否应该做一些类似的事情:
dgtc.Binding=newbinding(“UnitInfo.AUnit.MaxDepthRelativeToEntry”)
,如果UnitInfo是包装类,我会将问题更新为well@KSF我的答案不会改变,尽管您必须向绑定路径添加一个属性。例如,如果您绑定到
UnitInfo
对象的集合,并且每个对象都有一个
Unit
属性,该属性可以是
AUnit类型
BUnit
,那么您的绑定将只是
{binding Unit.MaxDepthRelativeToEntry}
新绑定(“Unit.MaxDepthRelativeToEntry”)
。字符串中的文本应该匹配正常的c#看起来像什么样…如果您可以编写
UnitStatusCollection[0].Unit.MaxDepthRelativeToEntry
,那么您的绑定应该是
Unit.MaxDepthRelativeToEntry
@KSF如果您仍然不清楚,请编辑您的问题以包括对象模型的结构。这就是定义绑定路径的内容。我忽略了提到我的单元周围有一个包装器类,我的站点msSource是在XAML中设置的,如下所示:
ItemsSource=“{Binding UnitStatusCollection,Mode=TwoWay}”
。我是否应该执行类似的操作:
dgtc.Binding=new Binding(“UnitInfo.AUnit.MaxDepthRelativeToEntry”)
,如果UnitInfo是包装类,我会将问题更新为well@KSF我的答案不会改变,尽管您必须向绑定路径添加一个属性。例如,如果您绑定到
UnitInfo
对象的集合,并且每个对象都有一个
Unit
属性,该属性可以是
AUnit类型
BUnit
,那么您的绑定将只是
{binding Unit.MaxDepthRelativeToEntry}
新绑定(“Unit.MaxDepthRelativeToEntry”)
。字符串中的文本应该匹配正常的c#看起来像什么样…如果您可以编写
UnitStatusCollection[0].Unit.MaxDepthRelativeToEntry
,则您的绑定应该是
Unit.MaxDepthRelativeToEntry
@KSF如果您仍然不清楚,请编辑您的问题以包括对象模型的结构。这就是定义绑定路径的内容。