2013-01-13 5 views
2

IsEnabled 속성을 컨텍스트 menuitem에 바인딩하려고합니다. 컨텍스트 메뉴는 Devexpress GridControl.View에 있습니다.GridControl.View에서 IsEnabled 속성 바인딩

문제는 DataContext에 있다고 가정합니다. barbutton 항목은 모눈의 DataContext에서 HasPermissionDelete 속성을 검색하고 있습니다. 그러나 이것은 뷰 모델의 데이터 인터페이스가 아닙니다. 내 자산 HasPermissionDelete이 ViewModel에 있습니다.

저는 caliburn.micro를 사용하고 있습니다.

이 바인딩을 수정하는 데 도움을 줄 수 있습니까?

내 XAML 코드 :

<dxg:GridControl.View> 
    <dxg:TableView x:Name="gridTable" AllowSorting="True" NavigationStyle="Row" MultiSelectMode="Row" AutoWidth="True" AllowEditing="False" AllowFilterEditor="True" AllowDrop="True" AllowGrouping="True" ShowGroupPanel="False" AllowMoveColumnToDropArea="True" SelectedRowsSource="{Binding SelectedUsers}"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="RowDoubleClick"> 
       <cal:ActionMessage MethodName="Edit" /> 
      </i:EventTrigger> 

      <i:EventTrigger EventName="Loaded"> 
       <cal:ActionMessage MethodName="InitializePrintableSource" > 
        <cal:Parameter Value="{Binding ElementName=gridTable}"></cal:Parameter> 
       </cal:ActionMessage> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 

     <dxg:TableView.RowCellMenuCustomizations> 
      <dxb:BarButtonItem x:Name="btnDelete" Content="{lex:LocText Translations:Delete, Assembly=Prosa.Common.Modules.UserManagement}" IsEnabled="{Binding Path=HasPermissionDelete}"/> 
     </dxg:TableView.RowCellMenuCustomizations> 
    </dxg:TableView> 
</dxg:GridControl.View> 

답변

1

당신이 Caliburn 마이크로를 사용하는 경우에도 당신은 여전히 ​​바인딩 표준 XAML로 다시 떨어질 수있다. DevExpress DataGrid가 Page 또는 UserControl의 루트 요소 인 간단한 Grid 안에 있다고 가정합니다. 그래서, 당신은이 구조 같은 것이다 : 그래서

<Grid x:Name="root"> 

     <dxg:GridControl> 
     ... 
     (your GridControl.View and everything else here) 
     ... 
     </dxg:GridControl> 
</Grid> 

, 당신의 버튼에 GridControl의 DataContext를 사용을 피하는를, 당신이이 경우에 해당 뷰 모델이 될 것입니다 루트 그리드의 DataContext에에 바인딩 할 수 있습니다. 이처럼 버튼 바인딩 : 당신은 항상 바인딩에 참조 다음 (이 예에서 "루트") 요소의 이름을 설정에 의해,이 방법으로 원하는 데이터 컨텍스트를 얻을 수 있습니다

<dxb:BarButtonItem x:Name="btnDelete" Content="{lex:LocText Translations:Delete, Assembly=Prosa.Common.Modules.UserManagement}" 
IsEnabled="{Binding ElementName=root, Path=DataContext.HasPermissionDelete}"/> 

. 이름이없는 요소에도 바인딩 할 수 있지만 바인딩 표현식은 훨씬 더 복잡합니다 (RelativeSource를 사용하고 요소 유형을 선택해야 함).

호프가 문제를 해결할 수 있기를 바랍니다.

+0

답변 해 주셔서 감사합니다. 귀하의 가정은 옳습니다. 그리드에 있어요. 불행히도 바인딩과 그리드 명명을 업데이트하면 결과에 다음과 같은 오류가 발생합니다. System.Windows.Data 오류 : 4 : 'ElementName = Root'참조로 바인딩 소스를 찾을 수 없습니다. BindingExpression : Path = DataContext.HasPermissionDelete; DataItem = null; 대상 요소는 'BarButtonItem'(HashCode = 56096403)입니다. 대상 속성이 'IsEnabled'(유형 '부울') 도와 줄 수 있습니까? – bitsmuggler

+1

대문자 R을 가진 "Root"엘리먼트에서 오류가 발생하는 것을 볼 수 있습니다. 바인딩 표현은 괜찮아 보입니다 ... 바인딩이 실패 할 때 항상 다음 사항을 확인하십시오 : 1. 철자 (대소 문자를 구별하고 인텔리 센스가 도움이되지 않습니다. 속성 또는 요소 이름), 2. 바운드 속성은 공용 get/set 어커 스터와 공용입니다. 3. 컬렉션 인 경우 초기화되고 무언가가 포함되어 있는지 확인하십시오. 내게 알려줘, 안부. – Hannish

+1

도움 주셔서 감사합니다. 불행하게도, 캐피탈 R이 아니 었습니다. 아마 mvvm devex/caliburn-problem이 있다고 가정합니다. 이제는 명령을 사용하고 있습니다 (사용/사용 안함이 더 좋습니다). 내 새로운 바인딩은 다음과 같습니다. Command = "{바인딩 경로 = (dxg : GridPopupMenu.GridMenuInfo) .View.DataContext.EditExecutor.EditCmd, RelativeSource = {RelativeSource Self}}"/> – bitsmuggler