C# 在wpf中使用EntityFramework模型作为datacontext

C# 在wpf中使用EntityFramework模型作为datacontext,c#,wpf,entity-framework,data-binding,multidatatrigger,C#,Wpf,Entity Framework,Data Binding,Multidatatrigger,我正在创建一个简单的WPF应用程序,它需要使用实体框架模型显示/编辑来自SQL server的数据。我创建了一个小测试窗口来查看事情是如何工作的,我注意到属性更改事件和数据验证是自动实现的。 这是我的xaml: <Style TargetType="{x:Type Button}"> <Setter Property="IsEnabled" Value="False"/> <Style.Triggers>

我正在创建一个简单的WPF应用程序,它需要使用实体框架模型显示/编辑来自SQL server的数据。我创建了一个小测试窗口来查看事情是如何工作的,我注意到属性更改事件和数据验证是自动实现的。 这是我的xaml:

<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>
MHeight是一个整数,如果我在文本框中放入一个非整数值,它的边框将变为红色,按钮将被禁用(根据上面的验证样式)。如果单击该按钮,新数据将正确保存。

EF模型是否实现了INotifyPropertyChanged和IDataErrorInfo接口?

对于
INotifyPropertyChanged
是,它已经实现了,但是
IDataErrorInfo
您必须自己实现它。

您的实体继承自
EntityObject
,它自己继承自
StructuralObject
,后者最终实现了
INotifyPropertyChanged

,我想可能是有某种错误验证机制,因为当单击按钮时,
db.SaveChanges()
如果编辑的数据中有错误,则跳过该命令。没有例外,只是没有发生。我认为你混淆了数据验证和例外验证。DataValidation可以是个性化的,例如:不带@character的电子邮件可能会引发数据验证错误。为此,您应该使用IDataErrorInfo。但ExceptionValidation是任何在保存到数据库时会导致异常的数据,例如:int属性不能包含非数字字符,并且不会保存到数据库。EF handls异常验证错误
    //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();
    }