绑定不适用于MVVM中的usercontrols

绑定不适用于MVVM中的usercontrols,mvvm,Mvvm,此选项卡控件存在于我的主窗口中 <TabControl ItemsSource="{Binding MyTabItem}" SelectedItem="{Binding SelectedTab}"> <TabControl.ItemTemplate> <DataTemplate>

此选项卡控件存在于我的主窗口中

      <TabControl ItemsSource="{Binding MyTabItem}"
                  SelectedItem="{Binding SelectedTab}">
                   <TabControl.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Header}"/>
                        </DataTemplate>
                   </TabControl.ItemTemplate>
                    <TabControl.ContentTemplate>
                        <DataTemplate>
                            <uc:TabItemControl/>
                        </DataTemplate>
                    </TabControl.ContentTemplate>
                       </TabControl>

这是我的mainview模型:

命名空间iDeploy_MVVM.ViewModel { 公共类MainViewModel:NotifyObjectBase {

私有数据访问层da;
私人AITInfo选择它;
私有组件信息选择组件;
私有选项卡ItemViewModel selectedTab;
公共主视图模型()
{
da=新的DataAccessLayer();
this.Title=Common.iDeploy+Properties.Settings.Default.Environment;
this.AITs=da.getAITNames().Rows.Cast().Select(a=>
新AITInfo()
{
AITId=Convert.ToInt32(a[“AITId”].ToString()),
AITName=a[“AITName”].ToString()
}).ToList();
this.SelectedAIT=this.AITs[0];
}
公共组件信息SelectedComponent
{
获取{返回selectedComponent;}
设置
{
selectedComponent=值;
OnPropertyChanged(“SelectedComponent”);
selectedComponent.Tab=da.getApp(selectedComponent.ComponentId).Rows.Cast()
.选择(t=>
新的TabItemViewModel(
da.getAppRelease(Convert.ToInt32(t[“AppID”].ToString()).Rows.Cast()
.Select(ar=>newappreleaseinfo()
{
AppReleaseId=Convert.ToInt32(ar[“AppReleaseId”].ToString()),
ReleaseName=ar[“ReleaseName”].ToString(),
ReleaseRootPath=ar[“ReleaseRootPath”].ToString()
}).ToList(),
新AppInfo()
{
AppId=Convert.ToInt32(t[“AppId”].ToString()),
TechnologyName=t[“TechnologyName”].ToString()
})).ToList();
this.MyTabItem=selectedComponent.Tab;
if(this.MyTabItem.Count>0)
OnPropertyChanged(“MyTabItem”);
}
}
公共ICollection MyTabItem{get;set;}
}}
在mainview中更改combobox的值时,selectedcomponent将被激发,它将创建所需数量的tabitems实例,并在每个实例中加载usercontrol

我已经设置了usercontrol数据上下文

此组合框位于usercontrol内部

           <ComboBox ItemsSource="{Binding AppReleases}" DisplayMemberPath="ReleaseName" 
              SelectedValuePath="AppReleaseId"
              Style="{StaticResource CustomComboBoxStyle}"/>
    private AppReleaseInfo selectedApp;
    public TabItemViewModel(ICollection<AppReleaseInfo> appRelease, AppInfo app)
    {
        this.Header = app.TechnologyName;
        this.AppReleases = appRelease.Select(a=>a).ToList();
        OnPropertyChanged("AppReleases");
    }

    public TabItemViewModel()
    {

    }

    public string Header { get; set; }


    public IList<AppReleaseInfo> AppReleases { get; set; }

    public AppReleaseInfo SelectedApp
    {
        get { return selectedApp; }
        set
        {
            selectedApp = value;
            OnPropertyChanged("SelectedApp");

        }
      }

    }

这是我的usercontrol视图模型

           <ComboBox ItemsSource="{Binding AppReleases}" DisplayMemberPath="ReleaseName" 
              SelectedValuePath="AppReleaseId"
              Style="{StaticResource CustomComboBoxStyle}"/>
    private AppReleaseInfo selectedApp;
    public TabItemViewModel(ICollection<AppReleaseInfo> appRelease, AppInfo app)
    {
        this.Header = app.TechnologyName;
        this.AppReleases = appRelease.Select(a=>a).ToList();
        OnPropertyChanged("AppReleases");
    }

    public TabItemViewModel()
    {

    }

    public string Header { get; set; }


    public IList<AppReleaseInfo> AppReleases { get; set; }

    public AppReleaseInfo SelectedApp
    {
        get { return selectedApp; }
        set
        {
            selectedApp = value;
            OnPropertyChanged("SelectedApp");

        }
      }

    }
private AppReleaseInfo selectedApp;
公共选项卡ItemViewModel(ICollection AppElease、AppInfo app)
{
this.Header=app.TechnologyName;
this.appRelease=appRelease.Select(a=>a.ToList();
不动产变更(“估价”);
}
公共选项卡ItemViewModel()
{
}
公共字符串头{get;set;}
公共IList附件{get;set;}
选择的公共信息app
{
获取{return selectedApp;}
设置
{
selectedApp=值;
OnPropertyChanged(“SelectedApp”);
}
}
}
现在,Appreleases正在检索所有需要的值,通过ReleaseName,我需要在usercontrol组合框中显示名称。在调试时,我可以看到附件中的数据,但是usercontrol中的绑定不起作用。但是,tabitem标题绑定工作正常


请让我知道我错过了什么。我是否需要执行任何额外的步骤来确保usercontrol xaml文件中定义的绑定正常工作

每当绑定失败时,使用Snoop(搜索它)。您的选项卡项集合应该是一个可观察的集合,您可以根据需要清除并填充它。我在你的虚拟机中没有看到SelectedTab,所以我不知道这是否也会失败。您的组合框的选定项未绑定到您的SelectedApp,因此不确定是否不在问题中或这是您的问题。Selectedtab在那里,但我没有在这里显示它,因为它工作正常。是的,如果我们在选择选项卡时执行类似操作,则tabitem usercontrol的控件将被绑定,但由于这两个是不同的ViewModel,我不知道如何执行此操作。您是说您特别有一个在用户控件上下文中使用的vewmodel?如果是这样,那就是一种气味。别管了。在用户控件的表面上公开您希望绑定到其中的控件的内容。正如您在第二个viewmodel中看到的,有一个Header属性,用于显示每个选项卡项的名称。您可以看到标题绑定到itemtemplate下定义的mainview文本块。这非常好,因为我在主窗口中绑定它,它会自动找到contenttemplate中给定的usercontrol的Header属性datacontext。但是如果我在用户控件内部而不是在主窗口中绑定某些内容,如我所示的组合框,其属性Appreleases在第二个viewmodel中完美地生成了所需的值,但组合框没有显示任何内容