繁体   English   中英

实体框架字段是必需的 (MVVM)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM