Несколько экземпляров пользовательского элемента управления wpf используют одну и ту же модель просмотра

85
8

У меня есть приложение, которое при нажатии кнопки загружает новую tabitem с помощью usercontrol. Это прекрасно работает, но... Когда я снова нажимаю кнопку "Добавить", добавляется еще один tabitem с новым экземпляром usercontrol. Здесь возникает проблема.
Когда я добавляю некоторые данные в tab1 и переключаюсь на tab2, я также вижу введенные данные там. Как это возможно? Я использую новую viewmodel для каждого usercontrol, так как оба пользовательских элемента управления на tab1 и tab2 показывают одни и те же данные.
Вероятно, это будет что-то глупое, но я не могу найти его...


Структура выглядит так: MainWindow загружает UserControl с помощью только tabcontrol.
После нажатия кнопки "Добавить" в меню добавляется новый tabitem с новым пользовательским контролем на нем.


Здесь есть SO, некоторые из которых выглядят так, но разные.


Вот код.


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 имеет 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, 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 в качестве нового tabitem в tabcontrol:


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

Немного по пути я делаю что-то не так с привязкой, но, как сказано, я не могу найти его.


спасибо для любой помощи.

спросил(а) 2012-03-28T17:46:00+04:00 8 лет, 3 месяца назад
1
Решение
76

Кажется, вы дважды задаете DataContext каждого MemberControl.


Как только вы добавите MemberViewModel в свою коллекцию вкладок:


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

это создаст MemberControl из-за установленного вами DataTemplate.

Затем в вашем конструкторе MemberControl вы затем reset DataContext добавили новый экземпляр MemberViewModel:


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

Я предполагаю, что вы получаете значения по умолчанию в обеих вкладках из-за этого второго new.

ответил(а) 2012-03-28T18:00:00+04:00 8 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема