[英]Entity Framework Field Is Required (MVVM)
我一直有这个问题,并且在过去的几天里一直在试图弄清楚,我设置了第二个测试项目,因为我的第一个项目太大了,无法尝试解决这个问题。 我对 mvvm 还是很陌生,所以我还在学习。 每当我尝试使用 Entity 保存字段时,它开始抱怨 FirstName 字段是必需的,我将问题确定为与按钮的某些内容分开,因为每当我将按钮移动到与文本框相同的 UserControl 时,它将保存。 MainWindow 中的 TabControl 为每个选项卡都有一个 UserControl,每个选项卡都有自己的 ViewModel,然后 TabControl 本身有一个 ViewModel。
MainWindow只包含按钮和选项卡控件
<Window.Resources>
<vm:TabControlViewModel x:Key="tab"/>
</Window.Resources>
<Grid DataContext="{StaticResource tab}">
<TabControl Margin="10"
Width="500"
Height="500">
<TabItem Header="Test Tab 1">
<custom:TabOneUserControl/>
</TabItem>
<TabItem Header="Test Tab 2">
<custom:TabTwoUserControl/>
</TabItem>
</TabControl>
<Button Content="Save"
Width="120"
Height="50"
Margin="1114,604,41,38.5"
Command="{Binding SaveCommand}"/>
</Grid>
TabOneUserControl包含文本框和标签
<UserControl.Resources>
<vm:TabOneUserControlViewModel x:Key="vm"/>
</UserControl.Resources>
<Grid DataContext="{StaticResource vm}">
<StackPanel VerticalAlignment="Center">
<Label Content="First Name"
HorizontalAlignment="Center"/>
<TextBox Width="250"
Height="50"
Text="{Binding FirstName, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</Grid>
</UserControl>
TabTwoUserControl包含一个文本框和标签
<UserControl.Resources>
<vm:TabTwoUserControlViewModel x:Key="vm"/>
</UserControl.Resources>
<Grid DataContext="{StaticResource vm}">
<StackPanel VerticalAlignment="Center">
<Label Content="Last Name"
HorizontalAlignment="Center"/>
<TextBox Width="250"
Height="50"
Text="{Binding LastName, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</Grid>
</UserControl>
TabControlViewModel为选项卡控件
public class TabControlViewModel
{
public SaveCommand SaveCommand { get; set; }
private TabOneUserControlViewModel tabOneUserControl;
private TabTwoUserControlViewModel tabTwoUserControl;
public TabControlViewModel()
{
tabOneUserControl = new TabOneUserControlViewModel();
tabTwoUserControl = new TabTwoUserControlViewModel();
SaveCommand = new SaveCommand(this);
}
public void SaveInformation()
{
using (TestDbEntities test = new TestDbEntities())
{
test.FNs.Add(new FN
{
FirstName = tabOneUserControl.FirstName
});
test.LNs.Add(new LN
{
LastName = tabTwoUserControl.LastName
});
try
{
test.SaveChanges();
Debug.Print("SAVED CHANGES!");
}
catch (DbEntityValidationException ex)
{
foreach (var validationErrors in ex.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
Trace.TraceInformation(
"Class: {0}, Property: {1}, Error: {2}",
validationErrors.Entry.Entity.GetType().FullName,
validationError.PropertyName,
validationError.ErrorMessage);
}
}
}
}
}
}
TabOneUserControlViewModel对于第一个选项卡用户控件
public class TabOneUserControlViewModel : INotifyPropertyChanged
{
private string firstName;
public event PropertyChangedEventHandler PropertyChanged;
public string FirstName
{
get { return firstName; }
set
{
firstName = value;
OnPropertyChanged("FirstName");
}
}
public TabOneUserControlViewModel()
{
}
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
TabTwoUserControlViewModel对于第二个选项卡用户控件
public class TabTwoUserControlViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string lastName;
public string LastName
{
get { return lastName; }
set
{
lastName = value;
OnPropertyChanged("LastName");
}
}
public TabTwoUserControlViewModel()
{
}
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
感谢评论中的每个人的建议,Nawed 的评论完美地指出了我做错了什么。 这是我所做的最终代码更改:
TabControlViewModel去掉了字段,变成了属性
public class TabControlViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public SaveCommand SaveCommand { get; set; }
public TabOneUserControlViewModel TabOneUserControl { get; set; }
public TabTwoUserControlViewModel TabTwoUserControl { get; set; }
public TabControlViewModel()
{
TabOneUserControl = new TabOneUserControlViewModel();
TabTwoUserControl = new TabTwoUserControlViewModel();
SaveCommand = new SaveCommand(this);
}
public void SaveInformation()
{
using (TestDbEntities test = new TestDbEntities())
{
test.FNs.Add(new FN
{
FirstName = TabOneUserControl.FirstName
});
test.LNs.Add(new LN
{
LastName = TabTwoUserControl.LastName
});
try
{
test.SaveChanges();
Debug.Print("SAVED CHANGES!");
}
catch (DbEntityValidationException ex)
{
foreach (var validationErrors in ex.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
Trace.TraceInformation(
"Class: {0}, Property: {1}, Error: {2}",
validationErrors.Entry.Entity.GetType().FullName,
validationError.PropertyName,
validationError.ErrorMessage);
}
}
}
}
}
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
TabOneUserControl从网格中删除静态资源并用常规绑定替换它,然后更改 Text 元素中的绑定,这与我在第二个用户控件中所做的相同,因此我将否定发布第二个 UserControl:
<Grid DataContext="{Binding TabOneUserControl}">
<StackPanel VerticalAlignment="Center">
<Label Content="First Name"
HorizontalAlignment="Center"/>
<TextBox Width="250"
Height="50"
Text="{Binding FirstName, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</Grid>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.