簡體   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