绑定WPF MVVM中usercontrol内的内容

时间:2014-05-23 19:52:53

标签: mvvm user-controls

这就是我所拥有的。一个带有组合框和tabcontrol的主窗口,其视图模型附加了一个视图模型。 我有一个usercontrol与另一个viewmodel,这个usercontrol包含一个组合框和一个datagrid.Now当我从主组合框中选择一个项目时,viewmodel将计算在运行时需要生成多少个选项卡,并将usercontrol分配给每个tabitem 。我遇到的问题是,我无法绑定要在每个usercontrol选项卡项的组合框中填充的项目。以下是我的代码

MainWindow.xaml

    <Window x:Class="TsstApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:TsstApp"
    WindowState="Maximized"
    Title="MainWindow" Height="1333" Width="1024">
<Window.DataContext>
    <vm:MainViewModel/>
</Window.DataContext>
<Grid>
    <ComboBox HorizontalAlignment="Left" Margin="21,22,0,0" VerticalAlignment="Top"    
  Width="120" ItemsSource="{Binding Items}" DisplayMemberPath="ItemName" SelectedItem="
{Binding SelectedItem}"/>
    <TabControl HorizontalAlignment="Left" Height="928" Margin="10,69,0,0" 
 VerticalAlignment="Top" Width="996" ItemsSource="{Binding TabData}">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Tech}"/>
            </DataTemplate>

        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <vm:TabItemControl/>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>

</Grid>

以下是mainviewmodel

MainViewModel.cs

  public class MainViewModel : ViewModelBase
  {
     private ItemCollection selectedItem;

    public MainViewModel()
    {
        List<ItemCollection> ax = new List<ItemCollection>();

        ax.Add(new ItemCollection() { ItemId = 0, ItemName = "Hair" });
        ax.Add(new ItemCollection() { ItemId = 1, ItemName = "Fur" });
        ax.Add(new ItemCollection() { ItemId = 2, ItemName = "Tail" });
        this.Items = ax;
        RaisePropertyChanged("Items");
        this.SelectedItem = this.Items[0];
        RaisePropertyChanged("SelectedItem");
    }


    public IList<ItemCollection> Items { get; set; }


    public ItemCollection SelectedItem
   {
    get { return selectedItem ;}
    set {
        selectedItem = value;
        RaisePropertyChanged("SelectedItem");
       List<TabItemData> tabs = new List<TabItemData>();
        switch(selectedItem.ItemName)
        {
            case "Hair":
                for (int i = 0; i < 5;i++)
                {
                    tabs.Add(new TabItemData() { TabId = i, TabName = "Hair"+i.ToString() });
                }
                break;
            case "Fur":
                for (int i = 0; i < 3; i++)
                {
                    tabs.Add(new TabItemData() { TabId = i, TabName = "Fur" + i.ToString() });
                }
                break;
            case "Tail":
                for (int i = 0; i < 7; i++)
                {
                    tabs.Add(new TabItemData() { TabId = i, TabName = "Tail" + i.ToString() });
                }
                break;

        }
        SelectedItem.TabData = tabs;
        this.TabData = tabs.Select(t => new TabItemViewModel(t)).ToList();
        RaisePropertyChanged("TabData");

    }

}

public IList<TabItemViewModel> TabData { get; private set; }

    }

以下是我的usercontrol

UserControl.xaml

   <UserControl x:Class="TsstApp.TabItemControl"
         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" 
           xmlns:vm="clr-namespace:TsstApp"
         mc:Ignorable="d" 
         d:DesignHeight="1333" d:DesignWidth="1024">
   <UserControl.DataContext>
    <vm:TabItemViewModel/>
   </UserControl.DataContext>
  <Grid>
    <ComboBox HorizontalAlignment="Left" Margin="75,91,0,0" VerticalAlignment="Top"  
   Width="148" Height="27" ItemsSource="{Binding ReleaseItems}" 
   SelectedValuePath="ItemId" DisplayMemberPath="ItemName"/>
    <TextBox HorizontalAlignment="Left" Height="31" Margin="75,183,0,0" 
   TextWrapping="Wrap" Text="{Binding TextContent}" VerticalAlignment="Top" Width="148"/>
</Grid>
  </UserControl>

这是viewmodel

TabItemViewModel.cs

   public class TabItemViewModel : ViewModelBase
    {
    public TabItemViewModel()
    {

    }

    public TabItemViewModel(TabItemData t)
    {
        this.Tech = t.TabName;
        List<TabReleases> az = new List<TabReleases>();
        for(int i=0;i<10;i++)
        {
            az.Add(new TabReleases(){ReleaseId=i , ReleaseName=t.TabName + "-" + i.ToString()});
        }

        this.ReleaseItems = az;
    }


    public string Tech { get; set; }

    public IList<TabReleases> ReleaseItems { get; set; }
    }

现在,tabitem标题工作正常,正如你所看到的,我在mainwindows iteself中绑定了标题,但是usercontrol的组合框没有得到人工管理。

Kindlyhelp。

1 个答案:

答案 0 :(得分:0)

我终于解决了。我只是做错了一件事。我在tabitemcontrol中添加了datacontect,但它不是必需的,因为mainwindows中的tabcontrol已经有itemsource,它为tabitemview模型创建了实例