簡體   English   中英

將MenuItem的IsChecked綁定到TabItem的isSelected

[英]Binding MenuItem's IsChecked to TabItem's isSelected

基本上,我面臨着與使用動態選項卡將MenuItem的IsChecked綁定到TabItem的IsSelected所描述的同樣的問題,我將TabControl定制為具有自己的viewModel,而且我還有一個菜單綁定到相同的源。 發生的是將menuItemisChecked綁定到isSelected不再起作用。 I thought IsSelected can not be found as there's no such property in viewModel

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

我嘗試使用建議的解決方案來構造TabItem列表,但出現錯誤Unable to cast object of type TabData to type TabItem 以下是我的xaml和轉換器。 我認為它會失敗,因為在構建過程中TabControl.items將返回viewmodel實例而不是UIControl TabItem 任何建議如何在這里進行綁定?

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;
}

在此處輸入圖片說明

這是基於提供的項目所做的更改

從綁定中刪除以下內容,這不是必需的

,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

<Setter Property="IsSelected" Value="{Binding IsSelected}" />

修改TabData類,如下所示

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));
    }
}

這是您在項目中需要更改以將菜單項的同步到選中的選項卡項的所有更改。

關於關閉標簽頁項目的第二個問題,您可以通過更改關閉按鈕的

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

CommandParameter="{Binding}"

示例項目TabControlSyncWithMenuItems.zip

讓我知道結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM