2013-01-21 4 views
3

: 비주얼 스튜디오의 출력 창 내 코드 나던에서바인딩 발견하지 소스 나 오류를 얻고있다

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=gridProductViewDataGrid'. BindingExpression:Path=SelectedItem; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'IsEnabled' (type 'Boolean')

어떻게해야되는 일을.

추가 기능은 사용하지 않아도되지만 제거가 비활성화되어 있지 않기 때문에 정상적으로 작동합니다.

<DataGrid AutoGenerateColumns="False" IsReadOnly="False" CanUserAddRows="False" CanUserDeleteRows="False" EnableRowVirtualization="True" ItemsSource="{Binding Items, Mode=TwoWay}" x:Name="gridViewProductDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" > 
     <DataGrid.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="{Binding LabelStrings.AddProductLabel, Source={StaticResource ResourceWrapper}}" Click="Add_Product_MenuItem_Click"/> 
       <MenuItem Header="{Binding LabelStrings.RemoveProductLabel, Source={StaticResource ResourceWrapper}}" Click="Remove_Product_MenuItem_Click" IsEnabled="{Binding ElementName=gridViewProductDataGrid, Path=SelectedItem, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ObjectToBooleanConverter}}"/> 
       </MenuItem> 
      </ContextMenu> 
     </DataGrid.ContextMenu> 

여기서 변환기는 단순히 개체가 없으면 true를 반환하고 존재하면 false를 반환합니다. 이 코드를 그리드 안팎으로 이동시키고 바인딩 순서를 다른 순서로 이동하려고했습니다. 코드를 실행하고 중단 점을 넣을 때 불리언 변환기의 코드는 사용되지 않습니다. 왜 그리드가 내부에있을 때 그리드를 볼 수 없습니까?

답변

3

ContextMenu가 다른 시각 트리에서 열리면 그의 부모 및 따라서 명명 된 바인딩이 작동하지 않습니다. 이 같은

시도 뭔가 :

IsEnabled="{Binding PlacementTarget.DataContext.SelectedItem, 
        RelativeSource={RelativeSource FindAncestor,AncestorType=ContextMenu}, 
        Converter={StaticResource ObjectToBooleanConverter}}" 

(DataGrid에 임)의 ContextMenu의 PlacementTarget 올바른의 DataContext를 얻기 위해 사용합니다.

또 다른 옵션은 ContextMenu에 NameScope을 설정하는 것입니다. 당신의 코드 숨김에 다음 줄을 추가합니다 : contextMenu 당신이 당신의 ContextMenu를 준 이름이다

NameScope.SetNameScope(contextMenu, NameScope.GetNameScope(this)); 

나는 이제 새로운 오류`System.Windows.Data 오류 얻을 관리해야
+1

: 40 : BindingExpression을 경로 오류 : 'PlacementTarget'속성이 'object'에 없습니다. ''GridViewProductUserControl '(Name =' ')'. BindingExpression : Path = PlacementTarget.DataContext.SelectedItem; DataItem = 'GridViewProductUserControl'(Name = ''); 대상 요소는 'MenuItem'(Name = ''); target Property is 'IsEnabled'(type 'Boolean') ' – Lainezor

+1

맞아요. MenuItem에서 이것을 설정하고 있다는 것을 눈치 채지 못했습니다. ContextMenu에 대한 RelativeSource로 내 대답을 업데이트했습니다. – Blachshma

+0

Brilliant! 그러나 DataGrid의 SelectedItem 값에 바인딩 할 수 있도록 'DataContext'부분을 삭제해야했습니다.

관련 문제