2012-07-01 2 views
1

Я создаю простое приложение WPF, которое должно отображать/редактировать данные с SQL-сервера с использованием модели Entity Framework. Я создал небольшое тестовое окно, чтобы увидеть, как все работает, и я заметил, что свойство измененных событий и проверка данных как бы автоматически реализованы. вот моя XAML:с использованием модели EntityFramework как datacontext в wpf

<Style TargetType="{x:Type Button}"> 
     <Setter Property="IsEnabled" Value="False"/> 
     <Style.Triggers> 
      <MultiDataTrigger> 
       <MultiDataTrigger.Conditions> 
        <Condition Binding="{Binding ElementName=txtRibbonCoreSize,Path=(Validation.HasError)}" Value="False"/> 
       </MultiDataTrigger.Conditions> 
       <Setter Property="IsEnabled" Value="True"/> 
      </MultiDataTrigger> 
     </Style.Triggers> 
    </Style> 

<StackPanel> 
    <ac:AutoCompleteBox x:Name="txtPrn1" Width="250" HorizontalAlignment="Left"         
          ValueMemberBinding="{Binding Converter={StaticResource prnC}}" 
          FilterMode="Contains" 
          ItemsSource="{Binding PrinterParams}"> 
     <ac:AutoCompleteBox.TextBoxStyle> 
      <Style TargetType="TextBox"> 
       <Setter Property="FocusManager.FocusedElement" 
         Value="{Binding RelativeSource={RelativeSource Self}}" /> 
      </Style> 
     </ac:AutoCompleteBox.TextBoxStyle> 
     <ac:AutoCompleteBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock> 
        <TextBlock.Text> 
         <MultiBinding StringFormat="{}{0} - {1}"> 
          <Binding Path="Manufacturer"/> 
          <Binding Path="Model"/> 
         </MultiBinding> 
        </TextBlock.Text> 
       </TextBlock> 
      </DataTemplate> 
     </ac:AutoCompleteBox.ItemTemplate> 
    </ac:AutoCompleteBox> 
    <TextBox Text="{Binding ElementName=txtPrn1,Path=SelectedItem.MHeight,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
    <Button x:Name="btn1" Content="Accept" Click="btn1_Click"/> 
</StackPanel> 

и вот мой код:

//instance of EF datamodel object 
    DbEntities db = new DbEntities(); 
    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     DataContext = db; 
    } 

    private void btn1_Click(object sender, RoutedEventArgs e) 
    { 
     db.SaveChanges(); 
    } 

MHeight является целым числом, и если я положить нон целое значение в текстовом поле это границы становится красным и кнопка становится недоступной (по к стилю проверки выше). если я нажму на кнопку, новые данные будут сохранены правильно.
ли модель EF реализует интерфейсы INotifyPropertyChanged и IDataErrorInfo?

ответ

3

Для INotifyPropertyChanged да, это уже реализовано, но IDataErrorInfo вы должны реализовать его самостоятельно.
Ваши Объекты наследуют от EntityObject которые оно само наследует от StructuralObject, который, наконец, реализует INotifyPropertyChanged

+0

хорошо я предполагаю, что есть какой-то механизм проверки ошибок, так как при нажатии на кнопку 'db.SaveChanges()' команда пропускается, если есть ошибки в редактируемых данных. не исключение, просто этого не происходит. – Yoav

+1

Я думаю, вы вводите в заблуждение между Data Validation и ExceptionValidation. DataValidation может быть персонализировано ex: электронное письмо без символа @ может вызвать ошибку проверки данных. Для этого вы должны использовать IDataErrorInfo.but ExceptionValidation - это любые данные, которые могут вызвать исключение при сохранении в базе данных, например: свойство int не могло иметь числовых символов и не будет сохраняться в базе данных. EF обрабатывает ошибки проверки исключений – HichemSeeSharp