C# 数据绑定工作不正常
在这个程序中,我可以通过单击“添加课程”按钮一次添加一个选项卡。理想情况下,选项卡的标题应该是我输入的课程名称,选项卡上文本框中的文本应该显示课程名称 但是,它不能正常工作。当我尝试添加超过1个选项卡时,每次都会显示以下错误消息: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
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>