-1

I have a list(TabItemViewModel) which are binding to TabControl to generate TabItems and inside TabItemViewModel class I have second list(LanguageTexts) with some strings. But when I change variable value in anyone element in class LanguageTexts hViewModel.Items[0].languageTexts[0].ownedVersion = "test"; this are changing in all tabs, but I want only to change in one particular tab.

XAML:

    <TabControl ItemsSource="{Binding Path=Items}">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock
                Text="{Binding Path=Name}" />
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <StackPanel>
                    <Label Content="{Binding Path=languageTexts[0].ownedVersion}" HorizontalAlignment="Left" Margin="10,5,0,0" VerticalAlignment="Top" FontSize="18"/>

                </StackPanel>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>

C#

public class TabControlViewModel
{
    public ObservableCollection<TabItemViewModel> Items { get; set; } = new ObservableCollection<TabItemViewModel>
     {
                new TabItemViewModel {Name="Tab 1", IsSelected = true },
                new TabItemViewModel {Name="Tab 2" },
                new TabItemViewModel {Name="Tab 3" },
                new TabItemViewModel {Name="Tab 4" },
     };

}


public class TabItemViewModel
{
    public ObservableCollection<LanguageTexts> languageTexts { get; private set; } = new ObservableCollection<LanguageTexts>();

    public string Name { get; set; }
    private bool isSelected;

    public bool IsSelected
    {
        get { return isSelected; }
        set
        {
            isSelected = value;
            DoSomethingWhenSelected();
        }
    }
    private void DoSomethingWhenSelected()
    {
        if (isSelected)
            Debug.WriteLine("You selected " + Name);
    }
}

public class LanguageTexts : INotifyPropertyChanged
{
    private string _ownedVersion;
    public string ownedVersion
    {
        get
        {
            return _ownedVersion;
        }
        set
        {
            if (value != _ownedVersion)
            {
                _ownedGameVersionTXT = value;
                OnPropertyChanged();
            }
        }
    }


    public MainWindow()
    {
        InitializeComponent();

        LanguageTexts languageTexts = new LanguageTexts("en_US");

        foreach (var item in hViewModel.Items)
        {
            item.languageTexts.Add(languageTexts);
        }
Jorr1
  • 11
  • 6
  • Maybe this can help clearing focus when tab changes: https://stackoverflow.com/questions/6509264/wpf-weird-problem-in-databinding-with-tabcontrol – Juanma Feliu Mar 24 '21 at 21:48

1 Answers1

0

Since LanguageTexts is a class, each reference in your view models reference the same texts (class is a reference type). For each view to have its own copy, you would need to make a new copy for each view.

foreach (var item in hViewModel.Items)
{
    item.languageTexts.Add(new LanguageTexts("en_US"));
}
hijinxbassist
  • 3,667
  • 1
  • 18
  • 23