C# 绑定菜单项';s被选中为选项卡项';她当选了

C# 绑定菜单项';s被选中为选项卡项';她当选了,c#,wpf,xaml,menuitem,tabitem,C#,Wpf,Xaml,Menuitem,Tabitem,基本上,我面临的问题与在 我定制了TabControl,使其具有自己的viewModel,并且我有一个绑定到同一源的菜单。 所发生的情况是将menuItem的isChecked绑定到isSelected不再起作用我以为找不到IsSelected,因为viewModel中没有此类属性 <Setter Property="IsChecked" Value="{Binding IsSelected, Mode=TwoWay}" /> C# 公共对象转换(对象值、类型targetType、

基本上,我面临的问题与在 我定制了TabControl,使其具有自己的viewModel,并且我有一个绑定到同一源的菜单。 所发生的情况是将
menuItem
isChecked
绑定到
isSelected
不再起作用
我以为找不到IsSelected,因为viewModel中没有此类属性

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

公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性) { ItemCollection ic=(ItemCollection)值; 列表选项卡项=新列表(); foreach(ic中的var obj) { tabItems.Add((TabItem)obj); } 退货项目; }

以下是基于所提供项目的变更

从绑定中删除以下内容,这不是必需的

,Mode=OneWay,NotifyOnSourceUpdated=True,Converter={StaticResource TabControlItemConverter}
在样式中修改setter
TabMenuItemxxx

修改
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}"

样本项目


让我知道结果。

Ty,非常漂亮的答案!
CommandParameter=“{Binding}”
如何推断
TabItem
属于它自己?@baozi,
{Binding}
指绑定到元素的对象,在本例中是TabData类的实例。有关非限定{Binding}语法的详细信息,请参阅。我很高兴,这个解决方案帮助你解决了一些问题。最后但并非最不重要的是,快乐编码:)
<Setter Property="IsChecked" Value="{Binding Path=IsSelected, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=TabItem}}" />
<Setter Property="IsChecked" Value="{Binding Path=IsSelected, Mode=TwoWay/>
<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));
    }
}
CommandParameter="{Binding SelectedItem,ElementName=tabControl}"
CommandParameter="{Binding}"