[英]How to cast in XAML to access sub-class properties
在我的項目中,我有一個Units
列表,該列表被用作DataGrid的數據源。 Units
類型具有兩種子類,即AUnits
和BUnits
。 列表中的每個Unit
都是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
子類的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 /設置綁定/ etc時,我沒有可用的單元列表。 因此我無法從實例中獲取該屬性並將其返回。 有誰知道我可以使用的任何方式,最好是在XAML中,可以獲取要綁定到的類型的子類類型的屬性?
編輯:
我的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
的類的ObservableCollection
,該類包含一個Unit
和一個UnitStatus
。 我需要以MaxDepthRelativeToEntry
為Unit
訪問屬性UnitInfo
。 但我需要能夠將Unit
視為AUnit
如果要綁定到Unit
對象列表,則DataGridTextColumn
的DataContext
應該是AUnit
或BUnit
對象本身,因此,綁定路徑應該只是new Binding("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>
后台代碼:
var test = new List<ClassA>();
test.Add(new ClassB() { A = "A", B = "B" });
test.Add(new ClassC() { A = "A", C = "C" });
dgTest.ItemsSource = test;
類定義為
public class ClassA
{
public string A { get; set; }
}
public class ClassB : ClassA
{
public string B { get; set; }
}
public class ClassC : ClassA
{
public string C { get; set; }
}
輸出:
如果我在代碼隱藏中而不是在XAML中編寫綁定,它也可以以完全相同的方式工作:
colB.Binding = new Binding("B")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.