Wpf 如何将嵌套组件绑定到Treeview、textbox&;树景?

Wpf 如何将嵌套组件绑定到Treeview、textbox&;树景?,wpf,xaml,binding,Wpf,Xaml,Binding,我来自 这是我的情况。我有一个自定义选项卡控件。ItemsSource位于ViewModel中。[标题和内容]。现在内容只是简单的字符串 public ViewModel() { TabItems = new ObservableCollection<TabData>(); //dummy data TabItems.Add(new TabData() { Header = "Tab 1", Content = "Tab co

我来自 这是我的情况。我有一个自定义选项卡控件。ItemsSource位于ViewModel中。[标题和内容]。现在内容只是简单的字符串

public ViewModel()
    {
        TabItems = new ObservableCollection<TabData>();

        //dummy data
        TabItems.Add(new TabData() { Header = "Tab 1", Content = "Tab content 1" });
公共视图模型()
{
TabItems=新的ObservableCollection();
//虚拟数据
添加(新的TabData(){Header=“Tab 1”,Content=“Tab Content 1”});
但我想让内容成为其他控件,比如说一个包含文本框和Treeview的网格。 进行这种绑定的理想方法是什么?
我正在考虑创建一个userControl来保存包含textbox和treeview的网格,在原始的ViewModel中,我可以编写
Header=“Tab 1”,Content=newUserControl()

以下是如何实现嵌套组件的视图模型

我将通过MVVM在选项卡2中显示一个用户控件来演示这一点

因此,让我们首先定义一个视图模型类

公共类选项卡2ViewModel:ViewModelBase { 公共选项卡2ViewModel() { TabCommand=新的SimpleCommand(OnTabCommand); } 公共ICommand TabCommand{get;private set;} 私有void ontabj命令(对象obj) { TabText=“单击了按钮”; } 私有字符串(tabText); 公共字符串选项卡文本 { 获取{return\tabText;} 设置 { _tabText=值; RaisePropertyChanged(); } } } 上面代码中的
ViewModelBase
类是
INotifyPropertyChanged
的一个实现,提供了一个方法
RaisePropertyChanged
来通知属性更改

让我们定义此视图模型的视图

<UserControl x:Class="test_tab_control5.Views.Tab2View"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <StackPanel>
        <TextBlock Text="Tab 1"
                   FontWeight="Bold" Margin="10"/>
        <TextBlock Text="{Binding TabText,FallbackValue=tab text}" Margin="10"/>
        <Button Command="{Binding TabCommand}"
                Content="Click me"  HorizontalAlignment="Center"/>
    </StackPanel>
</UserControl>
请注意,我将内容设置为
Tab2ViewModel
,而不是任何用户控件,这允许我在视图模型和视图之间实现松散耦合

因此,WPF将用户控件解析为
Tab2ViewModel

结果


以下是上述代码的完整工作示例:

MD5校验和:
4BA61028B5179AA884ECAC21D69A816A

此示例基于上一个问题中共享的示例


在这个工作示例中,我还尝试展示了几种定义模板和资源字典用法的方法,理想的方法是使用视图模型和数据模板,而不是使用usercontrol本身作为内容。我假设这个问题与您之前的问题相同,我将根据测试项目回答您的问题问题中的ect。这很有启发性!!在您的示例中,
是在主窗口中定义的。我可以说它将自动查找自己的数据模板,而
中的另一个
选项卡2viewmodel
也将查找它的数据模板我试图向您展示如何使用数据模板来解析任何视图模型的e视图。例如,对于
vm:MainViewModel
它将加载一个选项卡控件,对于
Tab2ViewModel
它将解析为一个完整的用户控件。我还尝试展示了如何分离代码的不同方面,以便代码不会变得混乱。最后但并非最不重要的是,只要定义并包含数据模板资源wpf中的ed将自动查找相同的数据类型,所有您需要为正确的数据类型定义相同的数据类型。我希望此示例可以帮助您使用mvvm探索更多wpf。还可以查看资源文件夹中的
DataTemplates.xaml
,其中包含MainViewModel和Tab2ViewModel的数据模板。您可以定义e此处的其他数据模板。此文件包括
Styles.xaml
,其中包含控件的样式,并将其添加到
App.xaml
的合并字典中,以便在应用程序中的任何位置都可以使用。
<DataTemplate DataType="{x:Type vm:Tab2ViewModel}">
    <vw:Tab2View />
</DataTemplate>