簡體   English   中英

如何強制轉換為XAML以訪問子類屬性

[英]How to cast in XAML to access sub-class properties

在我的項目中,我有一個Units列表,該列表被用作DataGrid的數據源。 Units類型具有兩種子類,即AUnitsBUnits 列表中的每個Unit都是AUnitBUnit 我的問題是,當我嘗試綁定到特定於子類單元類型之一的屬性時,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 我需要以MaxDepthRelativeToEntryUnit訪問屬性UnitInfo 但我需要能夠將Unit視為AUnit

如果要綁定到Unit對象列表,則DataGridTextColumnDataContext應該是AUnitBUnit對象本身,因此,綁定路徑應該只是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM