wpf用户控件的多个实例都使用相同的viewmodel

时间:2012-03-28 14:46:33

标签: c# wpf mvvm wpf-controls

我有一个应用,当我点击一个按钮加载一个带有usercontrol的新tabitem。这工作正常,但是...当我再次单击“添加”按钮时,会添加另一个tabitem以及usercontrol的新实例。这就是问题所在。 当我在tab1中添加一些数据并切换到tab2时,我也看到了输入的数据。这怎么可能?我为每个usercontrol使用了一个新的viewmodel,因此tab1和tab2上的usercontrols如何显示相同的数据。 它可能是一些愚蠢的东西,但我找不到它......

结构是这样的:MainWindow只加载一个tabcontrol的UserControl。 单击菜单中的“添加”按钮后,将添加一个新的tabitem,并在其上添加新的usercontrol。

这里有一些问题看起来像这样但是不同......

这是一些代码。

TabControl.xaml:

<Grid>
<TabControl x:Name="tabControl"
                            ItemsSource="{Binding TabItems}"
                            SelectedIndex="0">
        <TabControl.Resources>
            <DataTemplate DataType="{x:Type ViewModel:OverviewViewModel}">
                <my:OverviewControl />
            </DataTemplate>
            <DataTemplate DataType="{x:Type ViewModel:MemberViewModel}">
                <my:MemberControl />
            </DataTemplate>
        </TabControl.Resources>
  <TabControl.ItemContainerStyle>
                <Style TargetType="TabItem">
                    <Setter Property="Header"
                                    Value="{Binding Header}" />
                </Style>
  </TabControl.ItemContainerStyle>
</TabControl>
</Grid>

TabControl.cs

public TabControl()
    {
        InitializeComponent();
        this.DataContext = new TabViewModel(true);
    }

TabViewModel有一个包含tabitems的DP:

        public static readonly DependencyProperty TabItemsProperty = DependencyProperty.Register("TabItems", typeof(ObservableCollection<ITabViewModel>), typeof(TabViewModel), new UIPropertyMetadata(new ObservableCollection<ITabViewModel>()));
    public ObservableCollection<ITabViewModel> TabItems
    {
        get { return (ObservableCollection<ITabViewModel>)GetValue(TabItemsProperty); }
        set { SetValue(TabItemsProperty, value); }
    }

在tabitem上加载的usercontrol,MemberControl.cs

public MemberControl()
{
  InitializeComponent();
    this.DataContext = new MemberViewModel{};
}

MemberControlViewModel:

    private MemberModel _memberModel = new MemberModel();

public MemberViewModel()
{
  Address = new AddressViewModel();
}

    public static readonly DependencyProperty FirstNameProperty = DependencyProperty.Register("FirstName", typeof(string), typeof(MemberViewModel), new UIPropertyMetadata(string.Empty, OnFirstNameChanged));
    public string FirstName
    {
        get { return (string)GetValue(FirstNameProperty); }
        set { SetValue(FirstNameProperty, value); }
    }

    public static void OnFirstNameChanged(DependencyObject m, DependencyPropertyChangedEventArgs e)
    {
        var d = m as MemberViewModel;
        if (d._memberModel != null)
            d._memberModel.FirstName = d.FirstName;
    }


    public static readonly DependencyProperty LastNameProperty = DependencyProperty.Register("LastName", typeof(string), typeof(MemberViewModel), new UIPropertyMetadata(string.Empty, OnLastNameChanged));
    public string LastName
    {
        get { return (string)GetValue(LastNameProperty); }
        set { SetValue(LastNameProperty, value); }
    }

    public static void OnLastNameChanged(DependencyObject m, DependencyPropertyChangedEventArgs e)
    {
        var d = m as MemberViewModel;
        if (d._memberModel != null)
            d._memberModel.LastName = d.LastName;
    }
etc...

然后最后我的菜单上的命令实际上将membercontrol添加为tabcontrol上的新tabitem:

    private void LoadNewMember(object notUsed)
    {
        _tabViewModel.TabItems.Add(new MemberViewModel { Header = "New Member" });
        _addOverview.RaiseCanExecuteChanged();
    }

我一直在做一些错误的绑定,但正如所说,我找不到它..

请求任何帮助。

1 个答案:

答案 0 :(得分:3)

您似乎正在为每个MemberControl设置两次DataContext。

MemberViewModel添加到标签集时

_tabViewModel.TabItems.Add(new MemberViewModel { Header = "New Member" });

由于您已设置的DataTemplate,这将创建MemberControl

然后,在MemberControl的构造函数中,然后将DataContext重置为MemberViewModel的新实例:

public MemberControl()
{
    InitializeComponent();
    this.DataContext = new MemberViewModel{};
}

我认为由于这第二个new,您在两个标签中都会获得默认值。