C# WPF绑定选项卡控件选项卡项
我对WPF中的MVVM比较陌生,几天来一直在尝试解决一个问题。我正在使用dragablz选项卡控件并绑定ItemsSource,它是一个对象的ObservableList。但是,选项卡项的内容是UserControl;其数据上下文为C# WPF绑定选项卡控件选项卡项,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我对WPF中的MVVM比较陌生,几天来一直在尝试解决一个问题。我正在使用dragablz选项卡控件并绑定ItemsSource,它是一个对象的ObservableList。但是,选项卡项的内容是UserControl;其数据上下文为null。我创建了一个简单的设置来演示我遇到的问题: 模型/视图模型类: public class Item { public string Header { get; set; } public ItemContent Body { get; set
null
。我创建了一个简单的设置来演示我遇到的问题:
模型/视图模型类:
public class Item
{
public string Header { get; set; }
public ItemContent Body { get; set; }
}
public class ItemContent
{
public string Name { get; set; }
public string Description { get; set; }
}
class MainWindowViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName]string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public ObservableCollection<Item> Items { get; set; }
}
威尔在对原问题的评论中回答了我的问题。我把他的回答用在了另一篇帖子上:做以下事情 我从UserControl中删除了此项:
<UserControl.DataContext>
<views:ItemContent />
</UserControl.DataContext>
我更新了主窗口的选项卡控件内容模板,如下所示:
<dragablz:TabablzControl.ContentTemplate>
<DataTemplate DataType="{x:Type views:ItemContent}">
<local:TabItemControl Body="{Binding Body}" />
</DataTemplate>
</dragablz:TabablzControl.ContentTemplate>
并将my UserControl更改为对TextBox的值使用BodyText属性:
<Grid x:Name="LayoutRoot">
<TextBox Text="{Binding BodyText}" />
</Grid>
这是什么?为UserControl定义DataContext。实际上,我现在已经将其设置为
。数据上下文应该来自父级。在usercontrol内部设置DC是一个主要的代码气味。不要这样做。您不应该这样做。您可能想阅读UC设计中的常见陷阱的详细说明。UserControl的DataContext将是主窗口视图模型的Items集合中的任何内容。这就是你想要的吗?
<UserControl.DataContext>
<views:ItemContent />
</UserControl.DataContext>
public static readonly DependencyProperty BodyProperty =
DependencyProperty.Register("Body",
typeof(ViewModels.ItemContent),
typeof(TabItemControl),
new PropertyMetadata(null));
public ViewModels.ItemContent Body
{
get
{
return (ViewModels.ItemContent)GetValue(BodyProperty);
}
set
{
SetValue(BodyProperty, value);
}
}
public string BodyText {
get
{
return Body?.Name;
}
set
{
if (Body != null)
{
Body.Name = value;
}
}
}
<dragablz:TabablzControl.ContentTemplate>
<DataTemplate DataType="{x:Type views:ItemContent}">
<local:TabItemControl Body="{Binding Body}" />
</DataTemplate>
</dragablz:TabablzControl.ContentTemplate>
<Grid x:Name="LayoutRoot">
<TextBox Text="{Binding BodyText}" />
</Grid>