2016-07-07 3 views
0

私のプロジェクトでは、DataGridのデータソースとして使用されているUnitsのリストがあります。 Unitsタイプには、サブタイプがAUnitsBUnitsの2種類があります。リスト内の各Unitは、AUnitまたはBUnitのいずれかです。私の問題は、サブクラスのユニットタイプのいずれかに固有のプロパティにバインドしようとすると、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は、AUnitのサブクラスのプロパティであるため0になります。したがって、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を構築している/私はバインディングの設定など、私に利用可能なユニットのリストを持っていない/ 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" 
       > 

ItemsSourceUnitUnitStatusを保持しているUnitInfoと呼ばれるクラスのObservableCollectionあるUnitStatusCollectionに設定されています。私は Unitののプロパティにアクセスする必要があります。あなたがUnitオブジェクトのリストに結合されている場合でも、私はAUnit

答えて

2

としてUnitを見ることができるようにする必要があり、その後、あなたのDataGridTextColumnAUnitBUnitオブジェクト自体でなければなりませんので、あなたの結合パスだけであるべきnew Binding("MaxDepthRelativeToEntry")ためDataContext

1つのSubClassにのみ存在し、他のSubClassには存在しないプロパティに対しては、何らかのランタイム警告が表示されることがありますが、例外は発生しません。ここで

は例を与えるために迅速なコードサンプルです:

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; } 
} 
のように定義されています

Ou 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私の答えは変わりませんが、バインディングパスにプロパティをもう1つ追加する必要があります。例えば、あなたが 'UnitInfo'オブジェクトの集合にバインドしていて、各オブジェクトが' AUnit'か 'BUnit'型のどちらかである' Unit'プロパティを持っていたなら、あなたのバインディングは '{Binding Unit ' MaxDepthRelativeToEntry} 'または'新しいバインディング( "Unit.MaxDepthRelativeToEntry") 'を返します。文字列のテキストは、通常のC#のように一致するはずです...もしあなたが 'UnitStatusCollection [0] .Unit.MaxDepthRelativeToEntry'と書くことができるなら、あなたのバインディングは' Unit.MaxDepthRelativeToEntry'でなければなりません – Rachel

+0

@KSFもしあなたがまだ不明な点は、オブジェクトモデルの構造を含めるように質問を編集してください。これが、バインディングパスをどのようにすべきかを定義するものです。 – Rachel

関連する問題