2014-11-14 3 views
1

기본적으로 Binding MenuItem's IsChecked to TabItem's IsSelected with dynamic tabs 에 설명 된 것과 동일한 문제가 있습니다. TabControl에 자체 viewModel을 사용자 정의했습니다. 또한 동일한 소스에 바인딩하는 메뉴가 있습니다. 무슨 일이 일어 났습니까? menuItemisChecked ~ isSelected은 더 이상 작동하지 않습니다. 내가 솔루션을 사용하려고MenuItem의 IsChecked를 TabItem의 isSelected로 바인딩

<Setter Property="IsChecked" Value="{Binding IsSelected, Mode=TwoWay}" /> 

I thought IsSelected can not be found as there's no such property in viewModelTabItem의 목록을 구성하기 위해 제안하지만 오류 Unable to cast object of type TabData to type TabItem를 얻을. 아래 내 xaml 및 변환기입니다. 나는 공사 도중 TabControl.itemsUIControl TabItem 대신 viewmodel 인스턴스를 반환하기 때문에 실패했다고 생각했습니다. 여기에 바인딩하는 방법에 대한 제안?

XAML

<Menu Background="Transparent"> 
    <MenuItem 
     Style="{StaticResource TabMenuButtonStyle}" 
     ItemsSource="{Binding RelativeSource= 
      {RelativeSource FindAncestor, 
      AncestorType={x:Type TabControl}}, 
      Path=Items,Mode=OneWay,NotifyOnSourceUpdated=True,Converter={StaticResource TabControlItemConverter}}" 
     ItemContainerStyle="{StaticResource TabMenuItemxxx}"> 
    </MenuItem> 
</Menu> 

C 번호

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    ItemCollection ic = (ItemCollection)value; 
    List<TabItem> tabItems = new List<TabItem>(); 
    foreach (var obj in ic) 
    { 
     tabItems.Add((TabItem)obj); 
    } 
    return tabItems; 
} 
여기

enter image description here

답변

2

제공된 프로젝트의 변화 염기

요구되지 않으며, 상기 결합으로부터 다음 제거는
,Mode=OneWay,NotifyOnSourceUpdated=True,Converter={StaticResource TabControlItemConverter} 

TabMenuItemxxx

<Setter Property="IsChecked" Value="{Binding Path=IsSelected, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=TabItem}}" /> 

<Setter Property="IsChecked" Value="{Binding Path=IsSelected, Mode=TwoWay/> 

에가의 스타일에 다음 세터를 추가로 스타일 세터를 수정 TargetType="{x:Type TabItem}"

<Setter Property="IsSelected" Value="{Binding IsSelected}" /> 
이것은 당신이 탭 항목의이 선택에 체크 메뉴 항목의 동기화하는 프로젝트에서 변경하는 데 필요한 모든 것입니다

public class TabData : INotifyPropertyChanged 
{ 
    private bool isselected; 
    public string Header { get; set; } 
    public object Content { get; set; } 
    public bool IsEnabled { get; set; } 
    public bool IsSelected 
    { 
     get { return isselected; } 
     set 
     { 
      if (ViewModel.CurrentItem.IsSelected && ViewModel.CurrentItem != this) 
      { 
       ViewModel.CurrentItem.IsSelected = false; 
      } 
      isselected = value; 
      RaisePropertyChanged("IsSelected"); 

      if (ViewModel.CurrentItem != this) 
       ViewModel.CurrentItem = this; 

     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void RaisePropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

다음과 같이

TabData 클래스를 수정합니다.

탭 항목을 닫는에 대한 두 번째 문제에 대한

, 당신은 TabControlSyncWithMenuItems.zip

날 결과를 알려 닫기 버튼의

CommandParameter="{Binding SelectedItem,ElementName=tabControl}" 

CommandParameter="{Binding}" 

샘플 프로젝트로 변경하여 문제를 해결할 수 있습니다 .

+0

타이, 매우 아름다운 대답! 'CommandParameter = "{Binding}"은'TabItem'이 자신에게 속한다고 어떻게 추측합니까? – baozi

+0

@baozi,'{Binding} '은이 경우 TabData 클래스의 인스턴스 인 요소에 바인드 된 객체를 참조합니다. Unqualified {Binding} 구문과 [Binding Path Syntax] (http())에 대한 자세한 내용은 [Binding Markup Extension] (http://msdn.microsoft.com/en-us/library/ms750413(v=vs.110).aspx)을 참조하십시오. : //msdn.microsoft.com/en-us/library/ms752300 (v = vs.110) .aspx # Path_Syntax)를 참조하십시오. 나는이 솔루션이 당신의 문제를 해결하는 데 도움이 되었기 때문에 기쁘다. 마지막하지만 적어도, 행복한 코딩 :) – pushpraj