2016-07-07 53 views
0

在我的項目中,我有一個Units的列表,它被用作DataGrid的數據源。 Units類型有兩種類型的子類,AUnitsBUnits。列表中的每個Unit可以是AUnitBUnit。我的問題是,當我試圖綁定到一個特定於某個子類單元類型的屬性時,XAML沒有看到它,我只是回到0。通常情況下,如果這是在C#中完成的,我只需將其轉換並訪問該屬性,但在此時我無法在我的代碼中執行此操作。綁定正在C#中創建,如下所示:如何在XAML中投入以訪問子類屬性

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認爲我試圖訪問一個不存在的屬性。

我已閱讀並this answer到目前爲止,我已經嘗試了一些如下語法:

dgtc.Binding = new Binding("AUnit.MaxDepthRelativeToEntry") 
dgtc.Binding = new Binding("Unit(MyNameSpace:AUnit).MaxDepthRelativeToEntry") 
dgtc.Binding = new Binding("Unit(MyNameSpace:AUnit.MaxDepthRelativeToEntry)") 

,卻不能得到任何的那些工作。我也嘗試通過轉換器來做到這一點,但問題是,當我構建DataGrid /設置綁定/等時,我沒有可用的單元列表。所以我無法從該實例中獲取該屬性並將其返回。有誰知道我可以用什麼方法,最好是在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類,它擁有UnitUnitStatusObservableCollection。我需要訪問UnitInfoUnit中的MaxDepthRelativeToEntry。但我需要能夠看到Unit作爲AUnit

回答

2

如果綁定到Unit對象的列表,然後DataContextDataGridTextColumn應該是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; } 
} 

歐tput的:

enter image description here

它也完全一樣的方式,如果我寫的結合在後臺代碼,而不是在XAML:

colB.Binding = new Binding("B") 
+0

我忘了提及,有周圍的包裝類我單位,並且我的ItemsSource在XAML中是這樣設置的:'ItemsSource =「{Binding UnitStatusCollection,Mode = TwoWay}」'。如果UnitInfo是包裝類,我是否應該能夠執行如下操作:'dgtc.Binding = new Binding(「UnitInfo.AUnit.MaxDepthRelativeToEntry」)'?我也會更新這個問題 – KSF

+1

@KSF我的答案不會改變,儘管你必須在綁定路徑中添加一個屬性。例如,如果你綁定了一個'UnitInfo'對象集合,並且每個對象都有一個'Unit'屬性,可以是'AUnit'或'BUnit'類型,那麼你的綁定就是'{綁定單元。 MaxDepthRelativeToEntry}'或'新的綁定(「Unit.MaxDepthRelativeToEntry」)'。字符串中的文本應該匹配任何普通的c#看起來像......如果你可以寫'UnitStatusCollection [0] .Unit.MaxDepthRelativeToEntry',那麼你的綁定應該是'Unit.MaxDepthRelativeToEntry' – Rachel

+0

@KSF如果你還在不清楚,請編輯您的問題以包含您的對象模型的結構。這就是定義綁定路徑應該是什麼的。 – Rachel