我创建了继承自 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 的样式,所以我仍然会缺少我在自定义类中添加的属性。
我的项目是带有选项卡控件的简单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)
我可以看到我的父对话框收到了消息,但选项卡无论如何都在改变。知道如何防止选项卡更改吗?
我遇到了一种奇怪的绑定行为,这里描述了。我做了很多故障排除,我得出的结论是,最可能的问题在于我如何设置DataContext每个选项卡的视图。
我有一个TabControl其ItemsSource绑定到列表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)
我想大多数人也会这样做,但是......这种方法有一些 …
我有一个选项卡控件,其中有许多选项卡项。我正在尝试将多值转换器应用于 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”类型。谁能帮我摆脱这个问题?
tabcontrol ×4
wpf ×3
c++ ×1
datacontext ×1
datatemplate ×1
mvvm ×1
tabitem ×1
tabs ×1
win32gui ×1
winapi ×1
xaml ×1