标签: tabcontrol

TabControl 中的自定义 TabItem

我创建了继承自 TabItem 的 CustomTabItem,我想在 TabControl 中绑定 ObservableCollection 时使用它

<TabControl ItemsSource="{Binding MyObservableCollection}"/>
Run Code Online (Sandbox Code Playgroud)

它应该在 XAML 中是这样,但我不知道如何在绑定时更改 TabControl 创建的输出项的默认类型。

我尝试创建转换器,但它必须在 convertin 方法中执行以下操作:

List<CustomTabItem> resultList = new List<CustomTabItem>();
Run Code Online (Sandbox Code Playgroud)

并遍历我的输入 ObservableCollection,根据集合中的项目创建我的 CustomTab 并将其添加到 resultList ...

我想避免它,因为在创建 CustomTabItem 时我正在创建复杂的 View 并且需要一段时间,所以我不想在绑定集合中发生变化时总是创建它。

我的课程扩展了典型的 TabItem,我想在 TabControl 而不是 TabItem 中使用这个类。

        <TabControl.ItemContainerStyle>
            <Style TargetType="{x:Type local:CustomTabItem}">
                <Setter Property="MyProperty" Value="{Binding xxx}"/>
            </Style>
        </TabControl.ItemContainerStyle>
Run Code Online (Sandbox Code Playgroud)

上面的代码会生成错误,指出样式无法应用于 TabItem。

我的主要目的是在 XAML 中使用我自己的 CustomTabItem 并绑定属性......就像上面一样......

我也尝试使用

<TabControl.ItemTemplate/>
<TabControl.ContentTemaplte/>
Run Code Online (Sandbox Code Playgroud)

但它们只是 TabItem 的样式,所以我仍然会缺少我在自定义类中添加的属性。

wpf xaml tabcontrol tabitem

0
推荐指数
1
解决办法
4332
查看次数

选项卡控件:如何防止选择更改?

我的项目是带有选项卡控件的简单WIN32对话框。在某些情况下,我想阻止用户更改选项卡。MS文档非常简单 -

返回 TRUE 以防止更改选择,或返回 FALSE 以允许更改选择。

然而,这根本行不通!

代码:

	case WM_NOTIFY:
		if (((LPNMHDR)lParam)->idFrom == IDC_DEVTABS)
		{
			if (((LPNMHDR)lParam)->code == TCN_SELCHANGING)
				return  (INT_PTR)TRUE;
				//return  (INT_PTR)OnSelChanging(hDlgTab);
			if (((LPNMHDR)lParam)->code == TCN_SELCHANGE)
				OnSelChanged(hDlgTab);
				
			return  (INT_PTR)TRUE;			
		}
Run Code Online (Sandbox Code Playgroud)

我可以看到我的父对话框收到了消息,但选项卡无论如何都在改变。知道如何防止选项卡更改吗?

c++ winapi tabs tabcontrol win32gui

0
推荐指数
1
解决办法
753
查看次数

WPF MVVM:设置选项卡视图的 DataContext

我遇到了一种奇怪的绑定行为,这里描述。我做了很多故障排除,我得出的结论是,最可能的问题在于我如何设置DataContext每个选项卡的视图。

我有一个TabControlItemsSource绑定到列表ViewModels

MainView:
<TabControl ItemsSource="{Binding TabList}">
    <TabControl.Resources>
        <DataTemplate DataType="{x:Type vm:Tab1ViewModel}">
            <v:Tab1 />
        </DataTemplate>
    </TabControl.Resources>
...
</TabControl>

MainViewModel:
public ObservableCollection<TabViewModelBase> TabList { get; set; }
public MainViewModel()
{
    this.TabList = new ObservableCollection<TabViewModelBase>();

    // Tab1ViewModel is derived from TabViewModelBase
    this.TabList.Add(new Tab1ViewModel()); 
}
Run Code Online (Sandbox Code Playgroud)

所以,现在MainViewModel有一个列表TabViewModelBase,我相信这是正确的 MVVM 方法。视图 ( Tab1)TabViewModelBase是使用 定义的DataTemplate

这就是问题所在:

Tab1:
<UserControl.Resources>
    <vm:Tab1ViewModel x:Key="VM" />
</UserControl.Resources>
<UserControl.DataContext>
    <StaticResourceExtension ResourceKey="VM" />
</UserControl.DataContext>
Run Code Online (Sandbox Code Playgroud)

我想大多数人也会这样做,但是......这种方法有一些 …

wpf datacontext tabcontrol datatemplate mvvm

0
推荐指数
1
解决办法
2936
查看次数

无法将“MS.Internal.NamedObject”类型的对象转换为“System.IConvertible”

我有一个选项卡控件,其中有许多选项卡项。我正在尝试将多值转换器应用于 tabitem 的可见性属性。

<TabControl>
 <TabItem
            DataContext="{Binding TabModel[3]}"
            x:Name="Tab3"
            Header="Test">
                <TabItem.Visibility>
                    <MultiBinding Converter="{StaticResource settingsvisibility}">
                        <Binding Path="UserRole"/>
                        <Binding Path="UserName"/>
                    </MultiBinding>
                </TabItem.Visibility>
                <tabView:view />
            </TabItem></tabControl>
Run Code Online (Sandbox Code Playgroud)

我的转换器代码如下

 public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            Visibility visiblity = Visibility.Collapsed;
            int id = System.Convert.ToInt32(values[0]);
            string tabName = values[1].ToString();
...
....
...
}
Run Code Online (Sandbox Code Playgroud)

但是这些值没有正确传递。我收到以下异常

无法将“MS.Internal.NamedObject”类型的对象转换为“System.IConvertible”类型。谁能帮我摆脱这个问题?

wpf tabcontrol imultivalueconverter

0
推荐指数
1
解决办法
1599
查看次数