C# 数据绑定工作不正常

C# 数据绑定工作不正常,c#,wpf,data-binding,C#,Wpf,Data Binding,在这个程序中,我可以通过单击“添加课程”按钮一次添加一个选项卡。理想情况下,选项卡的标题应该是我输入的课程名称,选项卡上文本框中的文本应该显示课程名称 但是,它不能正常工作。当我尝试添加超过1个选项卡时,每次都会显示以下错误消息: System.Windows.Data Error: 40 : BindingExpression path error: 'Text' property not found on 'object' ''MyHomeworkViewModel' (HashCode=3

在这个程序中,我可以通过单击“添加课程”按钮一次添加一个选项卡。理想情况下,选项卡的标题应该是我输入的课程名称,选项卡上文本框中的文本应该显示课程名称

但是,它不能正常工作。当我尝试添加超过1个选项卡时,每次都会显示以下错误消息:

System.Windows.Data Error: 40 : BindingExpression path error: 'Text' property not found on 'object' ''MyHomeworkViewModel' (HashCode=33010577)'. BindingExpression:Path=Text; DataItem='MyHomeworkViewModel' (HashCode=33010577); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String')
此外,它似乎“覆盖”了其他选项卡的文本(只是文本,而不是标题)。例如,如果我添加一个标题为“a”的选项卡,则该选项卡的文本也是“a”。然后,如果我添加“B”,两个选项卡上的两个文本框都会变成“B”。但是,如果我打印出每个选项卡的文本属性(本例中是MyHomeworkModel),它们分别是“a”和“B”

我已经调试了一整天了,但是运气不好。任何帮助都将不胜感激

我的视图(DataContext设置为MyHomeworkViewModel):

我的ViewModel:

<Window x:Class="MyHomework__MVVM_.MyHomeworkView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="My Homework" Height="450" Width="800" ResizeMode="CanMinimize">
    <Grid Margin="0,0,10,10">
        <TabControl HorizontalAlignment="Left" Height="330" VerticalAlignment="Top" Width="764" Margin="10,10,0,0" ItemsSource="{Binding AllTabs}" SelectedItem="{Binding SelectedTab}">
            <TabControl.ItemContainerStyle>
                <Style TargetType="TabItem">
                    <Setter Property="Header" Value="{Binding Header}"/>
                    <Setter Property="Content">
                        <Setter.Value>
                            <Grid>
                                <TextBox Text="{Binding Text}" FontSize="16" AcceptsReturn="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                                </TextBox>
                            </Grid>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="FontSize" Value="20"/>
                </Style>
            </TabControl.ItemContainerStyle>
        </TabControl>
        <Button Content="Add Course" HorizontalAlignment="Left" VerticalAlignment="Top" Width="105" Margin="10,351,0,0" Height="50" Command="{Binding AddCourseCommand}"/>
        <Button Content="Drop Course" HorizontalAlignment="Left" VerticalAlignment="Top" Width="76" Margin="138,379,0,0" Height="22" Command="{Binding DropCourseCommand, UpdateSourceTrigger=PropertyChanged}"/>
        <Button Content="Save HW" HorizontalAlignment="Left" VerticalAlignment="Top" Width="105" Margin="669,351,0,0" Height="50"/>
    </Grid>
</Window>
using MyHomework;
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Input;

namespace MyHomework__MVVM_
{
    class MyHomeworkViewModel : INotifyPropertyChanged
    {
        private ObservableCollection<MyHomeworkModel> allTabs;
        private MyHomeworkModel selectedTab;
        private MyHomeworkView mainWindow;
        public event PropertyChangedEventHandler PropertyChanged;

        public MyHomeworkViewModel(MyHomeworkView mainWindow)
        {
            allTabs = new ObservableCollection<MyHomeworkModel>();
            this.mainWindow = mainWindow;
            AddCourseCommand = new AddCourseCommand(this);
            DropCourseCommand = new DropCourseCommand(this);
        }

        public ObservableCollection<MyHomeworkModel> AllTabs
        {
            get
            {
                return allTabs;
            }
            set
            {
                allTabs = value;
                OnPropertyChanged("AllTabs");
            }
        }

        public MyHomeworkModel SelectedTab
        {
            get
            {
                return selectedTab;
            }
            set
            {
                selectedTab = value;
                OnPropertyChanged("SelectedTab");
            }
        }

        public ICommand AddCourseCommand
        {
            get;
            private set;
        }

        public ICommand DropCourseCommand
        {
            get;
            private set;
        }

        public void AddNewTab()
        {
            NewCourseName ncn = new NewCourseName();
            ncn.Owner = mainWindow;
            ncn.ShowDialog();
            if (ncn.courseName != null)
            {
                MyHomeworkModel newTab = new MyHomeworkModel();
                newTab.Header = ncn.courseName;
                newTab.Text = ncn.courseName;
                AllTabs.Add(newTab);
                SelectedTab = newTab;
            }

            foreach (MyHomeworkModel item in AllTabs)
            {
                Console.WriteLine(item.Text);
            }
        }

        public bool CanDrop()
        {
            return SelectedTab != null;
        }

        public void RemoveTab()
        {
            DropCourseConfirmation dcc = new DropCourseConfirmation();
            dcc.Owner = mainWindow;
            dcc.ShowDialog();
            if (dcc.drop == true)
            {
                int index = AllTabs.IndexOf(SelectedTab);
                AllTabs.Remove(SelectedTab);

                if (AllTabs.Count > 0)
                {
                    if (index == 0)
                    {
                        SelectedTab = AllTabs[0];
                    }
                    else
                    {
                        SelectedTab = AllTabs[--index];
                    }
                }
                else
                {
                    SelectedTab = null;
                }
            }
        }

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}
使用我的家庭作业;
使用制度;
使用System.Collections.ObjectModel;
使用系统组件模型;
使用System.Windows.Input;
名称空间MyHomegraphy\uuuu MVVM_
{
类MyHomeworkViewModel:INotifyPropertyChanged
{
私有可观察集合所有选项卡;
私人我的家庭作业模式选择选项卡;
私有MyHomeworkView主窗口;
公共事件属性更改事件处理程序属性更改;
公共MyHomeworkView模型(MyHomeworkView主窗口)
{
allTabs=新的ObservableCollection();
this.mainWindow=mainWindow;
AddCourseCommand=新的AddCourseCommand(本);
DropCourseCommand=新的DropCourseCommand(该命令);
}
公共可观测集合所有选项卡
{
得到
{
返回所有标签;
}
设置
{
所有标签=值;
OnPropertyChanged(“所有标签”);
}
}
公共我的家庭作业模式选择选项卡
{
得到
{
返回所选选项卡;
}
设置
{
selectedTab=值;
已更改的房地产(“选定选项卡”);
}
}
公共ICommand AddCourseCommand
{
得到;
私人设置;
}
公共ICommand DropCourseCommand
{
得到;
私人设置;
}
公共无效AddNewTab()
{
NewCourseName ncn=新的NewCourseName();
ncn.Owner=主窗口;
ncn.ShowDialog();
如果(ncn.courseName!=null)
{
MyHomeworkModel newTab=新的MyHomeworkModel();
newTab.Header=ncn.courseName;
newTab.Text=ncn.courseName;
添加(newTab);
SelectedTab=newTab;
}
foreach(所有选项卡中的MyHomeworkModel项)
{
Console.WriteLine(item.Text);
}
}
公共图书馆
{
返回SelectedTab!=null;
}
公共无效删除选项卡()
{
DropCourseConfirmation dcc=新的DropCourseConfirmation();
dcc.Owner=主窗口;
ShowDialog();
如果(dcc.drop==true)
{
int index=AllTabs.IndexOf(SelectedTab);
所有选项卡。删除(已选择选项卡);
如果(AllTabs.Count>0)
{
如果(索引==0)
{
SelectedTab=所有选项卡[0];
}
其他的
{
SelectedTab=所有选项卡[--索引];
}
}
其他的
{
SelectedTab=null;
}
}
}
私有void OnPropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
}
}

如果您需要更多代码来帮助我,请告诉我。

您的
DataContext
与您想象的不同。在那里读取错误。它声明“Text”不是
MyHomeworkViewModel
上的有效属性,这是真的(与您的
MyHomeworkModel
相反)

您需要修改的不是ItemContainerStyle,而是
ItemTemplate
ContentTemplate
,它使用ItemsSource中的适当对象作为其
DataContext

此外,文本框中的绑定必须是
Text=“{binding Text,Mode=TwoWay}”
,否则它不会修改模型中的属性。

更改您的

<Setter Property="Content">
                        <Setter.Value>
                            <Grid>
                                <TextBox Text="{Binding Text}" FontSize="16" AcceptsReturn="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                                </TextBox>
                            </Grid>
                        </Setter.Value>
                    </Setter>

为此:

<Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                        <Grid>
                            <TextBox Text="{Binding Text}" FontSize="16" AcceptsReturn="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                            </TextBox>
                        </Grid>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>

如果不更改AddCourseCommand和DropCourseCommand(伪装为重复),问题仍然是一样的
<Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                        <Grid>
                            <TextBox Text="{Binding Text}" FontSize="16" AcceptsReturn="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                            </TextBox>
                        </Grid>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>