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如果您仍然不清楚,请编辑您的问题以包括对象模型的结构。这就是定义绑定路径的内容。