2017-07-20 9 views
1


まず、私はあなたに私のクラスを表示してみましょう:それは親とチャイルズのリストを持つことができるようDataGridRow.CellStyleのDataGrid ItemsSourceオブジェクトのプロパティにアクセスする方法?すべての

public class Model 
{ 
    public Model Parent {get; set;} 
    public ObservableCollection<Model> Childs {get; set;} 
    public ObservableCollection<Partner> Partners {get; set;} 
    public bool IsTopElement => Parent == null; 
} 

public class Partner 
{ 
    public bool IsActive {get; set;} 
    public string PartnerRole {get; set;} 
    public bool IsCustomer => PartnerRole == "Customer" 
} 

あなたが見ることができるように、Modelは階層です。私は、DataContextがModelのインスタンスに設定されているUserControlを持っています。このUserControlには、ItemsSourceがPartnersにバインドされているDataGridがあります。このDataGridでは、オブジェクトといくつかのDataGridTextColumnsのIsActiveプロパティにバインドされたDataGridCheckBoxColumnがあります。 私が達成したいのは、現在のModelオブジェクトがトップ要素ではなく(親を持たない)、IsCustomer == TruePartnerエントリに属する​​すべてのIsActiveCheckboxセルが無効になることです。
私は、次のXAMLコードを試してみました:

<UserControl DataContext="{Binding Model}"> 
    <DataGrid ItemsSource="{Binding Partners}" 
       AutoGenerateColumns="False" 
       CanUserResizeRows="False" 
       CanUserAddRows="False" 
       CanUserDeleteRows="False" 
       RowDetailsVisibilityMode="VisibleWhenSelected"> 
     <DataGrid.Columns> 
      <DataGridCheckBoxColumn Binding="{Binding IsActive}"> 
       <DataGridCheckBoxColumn.CellStyle> 
        <Style TargetType="{x:Type DataGridCell}"> 
         <Style.Triggers> 
          <MultiDataTrigger> 
           <MultiDataTrigger.Conditions> 
            <Condition Binding="{Binding Model.IsTopElement}" Value="False"/> 
            <Condition Binding="{Binding ???}"/> <!-- I'd have expected Binding="{Binding IsCustomer}" Value="True" to work, but it doesn't--> 
           </MultiDataTrigger.Conditions> 
           <Setter Property="IsEnabled" Value="False"/> 
          </MultiDataTrigger> 
         </Style.Triggers> 
        </Style> 
       </DataGridCheckBoxColumn.CellStyle> 
      </DataGridCheckBoxColumn> 
     </DataGrid.Columns>    
    </DataGrid> 
</UserControl> 

私が今直面してる問題は、私はMultiDataTriggerの第二の条件でDataGrid内PartnerオブジェクトのプロパティIsCustomerへのアクセスを持っていないということです。どうすればこのプロパティにアクセスできますか?また、私は、DataGridののItemsSourceがPartnersにバインドされているが、どうやら私は私にはかなり混乱している、持っているので、最初の条件でModelIsTopElementプロパティにアクセスすることを期待していませんでした。
ご協力いただければ幸いです。詳しい情報が必要な場合はお知らせください。

答えて

1

DataGridCellDataContextは、Partnerオブジェクトです。親にUserControlDataContextをバインドするのに{RelativeSource}を使うことができます。あなたの答えのための

<Style TargetType="{x:Type DataGridCell}"> 
    <Style.Triggers> 
     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
       <Condition Binding="{Binding DataContext.IsTopElement, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="False"/> 
       <Condition Binding="{Binding IsCustomer}" Value="True"/> 
      </MultiDataTrigger.Conditions> 
      <Setter Property="IsEnabled" Value="False"/> 
     </MultiDataTrigger> 
    </Style.Triggers> 
</Style> 
+0

ありがとう:これを試してみてください!しかし、私はあなたが何か誤解したと思います。これは私に問題を与えている 'Model'の' IsTopElement'プロパティではなく、私がアクセスできないDataGridRowの 'Partner'オブジェクトの' IsCustomer'プロパティです。私はあなたのアプローチを試みた。残念ながら、 ''は第2の条件では機能しませんでした。 VSは 'DataContext.IsCustomer'を解決できないと言っています。私はアプリケーションを実行することができますが、目的の動作は達成されません。 –

+0

どのような不動産が問題を引き起こしているか、どのように知っていますか?パートナーはModelプロパティを持たないので、最初のバインディングはなぜ機能しますか?あなたはここに全体像を与えていません...パートナークラスはIsCustomerプロパティを持っているので、私があなたに示したように、あなたはこのクラスに直接バインドすることができます。 – mm8

+0

はどうですか? PartnersとIsTopElementが同じクラスに属しているので動作します。少なくともあなたがここに投稿したコードです。あなたの問題は、あなたが提供した情報に基づいて再現できません。 – mm8

関連する問題