2010-07-29 6 views
2

저는 이것을 연구하는 데 많은 시간을 보냈습니다. 코드에서 INotifyPropertyChanged를 구현할 필요없이 XAML에서 완전히 단순 바인딩을 수행 할 수 있는지 궁금합니다.동일한 컨트롤에서 MenuItem 속성 (IsEnabled)을 콤보 상자 속성 (SelectedIndex)에 바인딩

역설적이게도, 나는 이것을 연구하는 데 걸린 시간에 5 번 이상 코드에서 끝낼 수있었습니다.

DataTriggers를 사용하는 것이 좋습니다 (MenuItems의 경우 DataTrigger가 스타일 트리거 안에 있어야 함). 나는 이것을 시도했지만 오류 없이는 작동하지 않는다.

다른 스레드에서 읽은 MenuItem 범위 문제로 인해 DataTrigger가 콤보 상자를 찾을 수 없다고 생각합니다.

누구든지 의견이 있으십니까?

코드하십시오 Menu합니다 (을 단순화하기에 모든 것을 넣어, 내가 (때문에 컴파일 오류) Style.Triggers 이전에 기본 세터를 이동

<ContextMenu> 
<MenuItem Header="Do Something Neat" x:Name="MyMenuItem" Click="MyMenuItem_Click"> 
    <MenuItem.Style> 
     <Style TargetType="{x:Type MenuItem}"> 
      <Style.Triggers> 
       <Setter Property="IsEnabled" Value="True" /> 
       <DataTrigger Binding="{Binding ElementName=MyComboBox, Path=SelectedIndex}" Value="-1"> 
        <Setter Property="IsEnabled" Value="False" /> 
       </DataTrigger>           
      </Style.Triggers> 
     </Style> 
    </MenuItem.Style> 
</MenuItem> 
</ContextMenu> 

답변

1

(더 빌드 또는 런타임 오류가 있지만, 속성이 업데이트되지 않음) 예) 결과를 더 잘 보여주기 위해 인덱스 0에서 트리거하도록 만들었습니다. 다음 작품들 :

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <DockPanel LastChildFill="False"> 
     <Menu Height="23" DockPanel.Dock="Top" > 
      <MenuItem Header="Do Something Neat"> 
       <MenuItem.Style> 
        <Style TargetType="{x:Type MenuItem}"> 
         <Setter Property="IsEnabled" Value="True" /> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding ElementName=MyComboBox, Path=SelectedIndex}" Value="0"> 
           <Setter Property="IsEnabled" Value="False" /> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </MenuItem.Style> 
      </MenuItem> 
     </Menu> 
     <ComboBox Name="MyComboBox" Height="23" Width="120" DockPanel.Dock="Top" > 
      <ComboBoxItem >Index0</ComboBoxItem> 
      <ComboBoxItem >Index1</ComboBoxItem> 
     </ComboBox> 
    </DockPanel> 
</Window>