Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF绑定选项卡控件选项卡项_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# WPF绑定选项卡控件选项卡项

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

我对WPF中的MVVM比较陌生,几天来一直在尝试解决一个问题。我正在使用dragablz选项卡控件并绑定ItemsSource,它是一个对象的ObservableList。但是,选项卡项的内容是UserControl;其数据上下文为
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>