[英]Binding MenuItem's IsChecked to TabItem's isSelected
基本上,我面臨着與使用動態選項卡將MenuItem的IsChecked綁定到TabItem的IsSelected所描述的同樣的問題,我將TabControl定制為具有自己的viewModel,而且我還有一個菜單綁定到相同的源。 發生的是將menuItem
的isChecked
綁定到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.