C# 设置第二个DataContext时失去DataContext焦点

C# 设置第二个DataContext时失去DataContext焦点,c#,wpf,xaml,mvvm,datagrid,C#,Wpf,Xaml,Mvvm,Datagrid,我有一个带有构造函数的类TabItemView.xaml.cs。我在它的DataContext中设置为MainViewModel,因为在TabItemView中找到了需要绑定数据的DataGrid public partial class TabItemView : UserControl { public TabItemView() { InitializeComponent(); MainViewModel myMode

我有一个带有构造函数的类
TabItemView.xaml.cs
。我在它的
DataContext
中设置为
MainViewModel
,因为在TabItemView中找到了需要绑定数据的DataGrid

public partial class TabItemView : UserControl
{
    public TabItemView()
        {
            InitializeComponent();
            MainViewModel myModel= new MainViewModel();
            this.DataContext = myModel;
        }
    }
在class
MainWindow.xaml.cs
中,我还在按钮单击事件中将
DataContext
设置为
MainViewModel
。此事件在单击按钮时添加新选项卡

 public partial class MainWindow2 : Window
    {
     //Constructor and some other stuf
                 .....
  private void AddInvoice_Click(object sender, RoutedEventArgs e)
    {
        count++;

        string s = string.Format("Tab {0}", count);
        mainViewModel.Items.Add(new ItemViewModel(s));
        this.DataContext = mainViewModel;
    }
}
这是我的
MainViewModel

 public class MainViewModel : ViewModelBase
{
    private ObservableCollection<ItemViewModel> items = new ObservableCollection<ItemViewModel>();
    private ObservableCollection<ItemViewModel> invoice_items = new ObservableCollection<ItemViewModel>();

    public ObservableCollection<ItemViewModel> Invoice_Items
    {
        get
        {
            return invoice_items;
        }
        set
        {
            invoice_items = value;
            OnPropertyChanged("Invoice_Items");
        }
    }

    public ObservableCollection<ItemViewModel> Items
    {
        get
        {
            return items;
        }
        set
        {
            items = value;
            OnPropertyChanged("Items");
        }
    }

    private int _selectedTabIndex;

public int SelectedTabIndex
{
    get { return _selectedTabIndex; }
    set { _selectedTabIndex = value; }
}

public MainViewModel()
{
    SelectedTabIndex = 0;
}


}
这是为
TabItemView

<UserControl x:Class="WPF_AccApp.Views.TabItemView"
         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" 
         mc:Ignorable="d" 
         d:DesignHeight="640" d:DesignWidth="800" Focusable="True" IsHitTestVisible="True">
    <Grid Name="grid1" HorizontalAlignment="Stretch" VerticalAlignment="Top" MinWidth="768" MinHeight="446" Focusable="True">
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="43" Height="*" />
            <RowDefinition Height="*" MinHeight="45" />
            <RowDefinition Height="*" MinHeight="45" />
            <RowDefinition Height="*" MinHeight="350" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" MinWidth="100" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <TextBox Text="{Binding Supplier}" Grid.Column="1" Height="27" Name="textBox1" VerticalAlignment="Top" Margin="11,6,0,0" HorizontalAlignment="Stretch" Width="Auto" FontSize="14" HorizontalContentAlignment="Stretch" MinWidth="141" FlowDirection="LeftToRight" DataContext="{Binding}" />
        <Label Content="Supplier" Height="27" Name="label2" VerticalAlignment="Top" FontSize="14" FontFamily="Tahoma" FontWeight="Bold" Margin="21,6,0,0" Width="Auto" IsEnabled="True" HorizontalAlignment="Stretch" Foreground="Black" Background="White" MinWidth="133" HorizontalContentAlignment="Stretch" />
        <TextBox Text="{Binding SupplierBank}" Grid.Column="1" Grid.Row="1" FontSize="14" Height="27" HorizontalAlignment="Stretch" Margin="11,6,0,0" Name="textBox11" VerticalAlignment="Top" Width="Auto" MinWidth="141" />
        <Label Grid.Row="1" Content="Supplier Bank" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label3" VerticalAlignment="Top" Width="Auto" Background="White" MinWidth="133" />
        <TextBox Text="{Binding SupplierAccount}" Grid.Column="1" Grid.Row="2" FontSize="14" Height="27" HorizontalAlignment="Stretch" Margin="11,6,0,0" Name="textBox12" VerticalAlignment="Top" Width="Auto" MinWidth="141" />
        <Label Grid.Row="2" Content="Account Number" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label4" VerticalAlignment="Top" Background="White" MinWidth="133" />
        <TextBox Text="{Binding Buyer}" Grid.Column="4" FontSize="14" Height="27" Margin="11,6,20,0" Name="textBox2" VerticalAlignment="Top" HorizontalAlignment="Stretch" Width="Auto" MinWidth="141" />
        <Label Grid.Column="3" Content="Buyer" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label5" VerticalAlignment="Top" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Background="White" MinWidth="133" />
        <TextBox Text="{Binding BuyerBank}" Grid.Column="4" Grid.Row="1" FontSize="14" Height="27" HorizontalAlignment="Stretch" Margin="11,6,20,0" Name="textBox3" VerticalAlignment="Top" Width="Auto" MinWidth="141" />
        <Label Grid.Column="3" Grid.Row="1" Content="Buyer Bank" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label6" VerticalAlignment="Top" Width="Auto" HorizontalAlignment="Stretch" Background="White" MinWidth="133" />
        <TextBox Text="{Binding BuyerAccount}" Grid.Column="4" Grid.Row="2" FontSize="14" Height="27" HorizontalAlignment="Stretch" Margin="11,6,20,0" Name="textBox4" VerticalAlignment="Top" Width="Auto" MinWidth="141" />
        <Label Grid.Column="3" Grid.Row="2" Content="Account Number" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label7" VerticalAlignment="Top" Width="Auto" HorizontalAlignment="Stretch" Background="White" MinWidth="133" />
    <DataGrid AutoGenerateColumns="False" Grid.ColumnSpan="5" Grid.Row="3" 
              Height="104" HorizontalAlignment="Stretch" Margin="55,115,55,0" Name="dataGrid1" 
              VerticalAlignment="Top" Width="Auto" CanUserResizeRows="True" ItemsSource="{Binding Invoice_Items}"
              IsReadOnly="False" SelectionUnit="Cell" CanUserAddRows="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Item Name" Binding="{Binding Item_Name, Mode=TwoWay}"/>
            <DataGridTextColumn Header="Mesure" Binding="{Binding Mesure, Mode=TwoWay}"/>
            <DataGridTextColumn Header="Quantity" Binding="{Binding Quantity, Mode=TwoWay}"/>
            <DataGridTextColumn Header="Price exc VAT" Binding="{Binding Price_exc_VAT, Mode=TwoWay}"/>
            <DataGridTextColumn Header="VAT" Binding="{Binding VAT, Mode=TwoWay}"/>
            <DataGridTextColumn Header="Price Inc VAT" Binding="{Binding Price_inc_VAT, Mode=TwoWay}"/>
            <DataGridTextColumn Header="Total" Binding="{Binding Total, Mode=TwoWay}"/>
        </DataGrid.Columns>
    </DataGrid>
    <TextBox Grid.ColumnSpan="3" Grid.Row="3" Height="27" HorizontalAlignment="Stretch" Name="textBox5" VerticalAlignment="Top" Grid.Column="1" Margin="11,0,0,0" />
    <Label Background="White" Content="Shipping Address" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,0,0,0" MinWidth="133" Name="label1" VerticalAlignment="Top" Grid.Row="3" />
    <Label Background="White" Content="Invoice #" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="78,65,0,0" MinWidth="133" Name="label8" VerticalAlignment="Top" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" />
</Grid>

现在问题来了。当我仅在
主窗口中设置DataContext时
my
文本框
的反应正常,my
ObservableCollection
项目会收到有关更改的通知。当我添加新选项卡时,它会在
文本框
中创建无文本的正常状态

但是,当我在
main窗口
TabItemView
中设置DataContext(就像我添加的代码)以通知我的发票项目
observedcollection
有关
DataGrid
中的更改时,这两个
observedcollection
的DataContext都丢失了,它们不再被通知更改。当我添加新选项卡时,它将复制我在
TextBox
s和
DataGrid
中先前选项卡中添加的数据

另外,当我没有在
main窗口中设置DataContext,并且仅在
TabItemView
my
ObservableCollection
Invoice\u中设置DataContext时,项目会收到有关
DataGrid
中更改的通知,但当我添加新选项卡时,
DataGrid
的数据只会在每个添加的选项卡中重复出现

为什么会这样,我做错了什么?我如何解决这个问题?
如果你需要更多的代码或信息,只需说。我正在寻求任何帮助,以了解如何解决我的问题。谢谢您的回答。

DataGrid的数据仅在每个添加的选项卡中重复。因为您为每个包含集合的选项卡设置了相同的ViewModel实例。>>当我在MainWindow和TabItemView中设置DataContext时,您在哪里为
TabItemView
设置了
DataContext
。在TabItemView构造函数中…
DataGrid的
数据只会在每个添加的选项卡中复制。因为您正在为每个包含集合的选项卡设置相同的ViewModel实例。>>当我在MainWindow和TabItemView中设置DataContext时,您在哪里为
TabItemView
设置
DataContext
。在TabItemView构造函数中。。。
<UserControl x:Class="WPF_AccApp.Views.TabItemView"
         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" 
         mc:Ignorable="d" 
         d:DesignHeight="640" d:DesignWidth="800" Focusable="True" IsHitTestVisible="True">
    <Grid Name="grid1" HorizontalAlignment="Stretch" VerticalAlignment="Top" MinWidth="768" MinHeight="446" Focusable="True">
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="43" Height="*" />
            <RowDefinition Height="*" MinHeight="45" />
            <RowDefinition Height="*" MinHeight="45" />
            <RowDefinition Height="*" MinHeight="350" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" MinWidth="100" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <TextBox Text="{Binding Supplier}" Grid.Column="1" Height="27" Name="textBox1" VerticalAlignment="Top" Margin="11,6,0,0" HorizontalAlignment="Stretch" Width="Auto" FontSize="14" HorizontalContentAlignment="Stretch" MinWidth="141" FlowDirection="LeftToRight" DataContext="{Binding}" />
        <Label Content="Supplier" Height="27" Name="label2" VerticalAlignment="Top" FontSize="14" FontFamily="Tahoma" FontWeight="Bold" Margin="21,6,0,0" Width="Auto" IsEnabled="True" HorizontalAlignment="Stretch" Foreground="Black" Background="White" MinWidth="133" HorizontalContentAlignment="Stretch" />
        <TextBox Text="{Binding SupplierBank}" Grid.Column="1" Grid.Row="1" FontSize="14" Height="27" HorizontalAlignment="Stretch" Margin="11,6,0,0" Name="textBox11" VerticalAlignment="Top" Width="Auto" MinWidth="141" />
        <Label Grid.Row="1" Content="Supplier Bank" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label3" VerticalAlignment="Top" Width="Auto" Background="White" MinWidth="133" />
        <TextBox Text="{Binding SupplierAccount}" Grid.Column="1" Grid.Row="2" FontSize="14" Height="27" HorizontalAlignment="Stretch" Margin="11,6,0,0" Name="textBox12" VerticalAlignment="Top" Width="Auto" MinWidth="141" />
        <Label Grid.Row="2" Content="Account Number" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label4" VerticalAlignment="Top" Background="White" MinWidth="133" />
        <TextBox Text="{Binding Buyer}" Grid.Column="4" FontSize="14" Height="27" Margin="11,6,20,0" Name="textBox2" VerticalAlignment="Top" HorizontalAlignment="Stretch" Width="Auto" MinWidth="141" />
        <Label Grid.Column="3" Content="Buyer" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label5" VerticalAlignment="Top" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Background="White" MinWidth="133" />
        <TextBox Text="{Binding BuyerBank}" Grid.Column="4" Grid.Row="1" FontSize="14" Height="27" HorizontalAlignment="Stretch" Margin="11,6,20,0" Name="textBox3" VerticalAlignment="Top" Width="Auto" MinWidth="141" />
        <Label Grid.Column="3" Grid.Row="1" Content="Buyer Bank" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label6" VerticalAlignment="Top" Width="Auto" HorizontalAlignment="Stretch" Background="White" MinWidth="133" />
        <TextBox Text="{Binding BuyerAccount}" Grid.Column="4" Grid.Row="2" FontSize="14" Height="27" HorizontalAlignment="Stretch" Margin="11,6,20,0" Name="textBox4" VerticalAlignment="Top" Width="Auto" MinWidth="141" />
        <Label Grid.Column="3" Grid.Row="2" Content="Account Number" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,6,0,0" Name="label7" VerticalAlignment="Top" Width="Auto" HorizontalAlignment="Stretch" Background="White" MinWidth="133" />
    <DataGrid AutoGenerateColumns="False" Grid.ColumnSpan="5" Grid.Row="3" 
              Height="104" HorizontalAlignment="Stretch" Margin="55,115,55,0" Name="dataGrid1" 
              VerticalAlignment="Top" Width="Auto" CanUserResizeRows="True" ItemsSource="{Binding Invoice_Items}"
              IsReadOnly="False" SelectionUnit="Cell" CanUserAddRows="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Item Name" Binding="{Binding Item_Name, Mode=TwoWay}"/>
            <DataGridTextColumn Header="Mesure" Binding="{Binding Mesure, Mode=TwoWay}"/>
            <DataGridTextColumn Header="Quantity" Binding="{Binding Quantity, Mode=TwoWay}"/>
            <DataGridTextColumn Header="Price exc VAT" Binding="{Binding Price_exc_VAT, Mode=TwoWay}"/>
            <DataGridTextColumn Header="VAT" Binding="{Binding VAT, Mode=TwoWay}"/>
            <DataGridTextColumn Header="Price Inc VAT" Binding="{Binding Price_inc_VAT, Mode=TwoWay}"/>
            <DataGridTextColumn Header="Total" Binding="{Binding Total, Mode=TwoWay}"/>
        </DataGrid.Columns>
    </DataGrid>
    <TextBox Grid.ColumnSpan="3" Grid.Row="3" Height="27" HorizontalAlignment="Stretch" Name="textBox5" VerticalAlignment="Top" Grid.Column="1" Margin="11,0,0,0" />
    <Label Background="White" Content="Shipping Address" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="21,0,0,0" MinWidth="133" Name="label1" VerticalAlignment="Top" Grid.Row="3" />
    <Label Background="White" Content="Invoice #" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" Height="27" Margin="78,65,0,0" MinWidth="133" Name="label8" VerticalAlignment="Top" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" />
</Grid>