Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 什么事件或绑定允许我在编辑开始时禁用“添加记录”按钮?_Wpf_Entity Framework_Events_Binding - Fatal编程技术网

Wpf 什么事件或绑定允许我在编辑开始时禁用“添加记录”按钮?

Wpf 什么事件或绑定允许我在编辑开始时禁用“添加记录”按钮?,wpf,entity-framework,events,binding,Wpf,Entity Framework,Events,Binding,我的WPF窗口直接绑定到实体框架数据上下文(CollectionViewSource)。一旦找到记录,用户立即开始编辑当表单变脏时,我想禁用“添加”按钮并启用“保存”和“撤消”按钮。有没有一种简单的方法可以使用绑定或事件来实现这一点 <TextBlock HorizontalAlignment="Right" VerticalAlignment="Center" Text="Name:" Margin="10"/> <TextBox x:Name="Na

我的WPF窗口直接绑定到实体框架数据上下文(CollectionViewSource)。一旦找到记录,用户立即开始编辑当表单变脏时,我想禁用“添加”按钮并启用“保存”和“撤消”按钮。有没有一种简单的方法可以使用绑定或事件来实现这一点

      <TextBlock HorizontalAlignment="Right" VerticalAlignment="Center" Text="Name:" Margin="10"/>
      <TextBox x:Name="NameTextBox" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Center" Margin="10" Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>

      <StackPanel Grid.Row="1" Grid.ColumnSpan="2" Orientation="Horizontal" HorizontalAlignment="Right">
        <Button Content="Save" HorizontalAlignment="Right" Margin="5" IsEnabled="{Binding IsDirty}" />
        <Button Content="Cancel" HorizontalAlignment="Right" Margin="5" IsEnabled="{Binding IsDirty}" Click="Cancel_Click"/>
        <Button Content="Add" HorizontalAlignment="Right" Margin="5" IsEnabled="{Binding IsClean}"/>
      </StackPanel>
  </Grid>
</Window>

我没有使用MVVM。我首先使用实体框架数据库和EF设计器。我希望避免为每个字段添加代码。数据库相当大。

如果您愿意,可以在没有事件的情况下执行此操作。您还可以利用
数据绑定的强大功能
,而不必走到MVVM的地步。下面的示例以一种非常简单的方式演示了如何实现这一点。如果您的实体类还没有IsDirty属性(自从我使用database first EF已经有一段时间了),您可以添加带有分部类的属性

      <TextBlock HorizontalAlignment="Right" VerticalAlignment="Center" Text="Name:" Margin="10"/>
      <TextBox x:Name="NameTextBox" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Center" Margin="10" Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>

      <StackPanel Grid.Row="1" Grid.ColumnSpan="2" Orientation="Horizontal" HorizontalAlignment="Right">
        <Button Content="Save" HorizontalAlignment="Right" Margin="5" IsEnabled="{Binding IsDirty}" />
        <Button Content="Cancel" HorizontalAlignment="Right" Margin="5" IsEnabled="{Binding IsDirty}" Click="Cancel_Click"/>
        <Button Content="Add" HorizontalAlignment="Right" Margin="5" IsEnabled="{Binding IsClean}"/>
      </StackPanel>
  </Grid>
</Window>
XAML:

      <TextBlock HorizontalAlignment="Right" VerticalAlignment="Center" Text="Name:" Margin="10"/>
      <TextBox x:Name="NameTextBox" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Center" Margin="10" Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>

      <StackPanel Grid.Row="1" Grid.ColumnSpan="2" Orientation="Horizontal" HorizontalAlignment="Right">
        <Button Content="Save" HorizontalAlignment="Right" Margin="5" IsEnabled="{Binding IsDirty}" />
        <Button Content="Cancel" HorizontalAlignment="Right" Margin="5" IsEnabled="{Binding IsDirty}" Click="Cancel_Click"/>
        <Button Content="Add" HorizontalAlignment="Right" Margin="5" IsEnabled="{Binding IsClean}"/>
      </StackPanel>
  </Grid>
</Window>
以及窗口背后的代码:

      <TextBlock HorizontalAlignment="Right" VerticalAlignment="Center" Text="Name:" Margin="10"/>
      <TextBox x:Name="NameTextBox" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Center" Margin="10" Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>

      <StackPanel Grid.Row="1" Grid.ColumnSpan="2" Orientation="Horizontal" HorizontalAlignment="Right">
        <Button Content="Save" HorizontalAlignment="Right" Margin="5" IsEnabled="{Binding IsDirty}" />
        <Button Content="Cancel" HorizontalAlignment="Right" Margin="5" IsEnabled="{Binding IsDirty}" Click="Cancel_Click"/>
        <Button Content="Add" HorizontalAlignment="Right" Margin="5" IsEnabled="{Binding IsClean}"/>
      </StackPanel>
  </Grid>
</Window>
namespace Test
{
  public partial class EditTesting : Window
  {
    private Entity _myEntity;

    public EditTesting()
    {
      InitializeComponent();
      _myEntity = new Entity();
      this.DataContext = _myEntity;
    }

    private void Cancel_Click(object sender, RoutedEventArgs e)
    {
      _myEntity.Name = string.Empty;
      _myEntity.IsDirty = false;
    }       
  }
}

这取决于“添加”按钮的工作方式。如果它只转到代码隐藏中的单击事件,您可能可以使用PreviewKeyDown或TextInput事件来禁用/启用按钮。如果它转到ViewModel中的命令,则可能可以将ICommand.CanExecute与EntityState绑定。请记住,某些控件(如文本框)默认仅在控件失去焦点时更改源属性,因此如果需要即时更改,您可能需要将某些绑定更改为
UpdateSourceTrigger=PropertyChanged
。我的添加按钮有一个调用AddNewRecord方法的单击事件。我喜欢使用PreviewKeyDown或TextInput的想法。我的应用程序已经有数百个字段,而且还在增长。修改每个EF属性/字段将变得极其乏味。我希望类似的方法已经内置到.Net中。这将使这种方法更加简单。谢谢你的回答。@DeveloperDan-明白。我原以为EF提供了
INotifyPropertyChanged
和脏跟踪的实现,但如果不是,那肯定是一个很大的变化。在未来,您可能需要考虑T4模板,以便可以添加对<代码> NoTyFyPryTyType < /C>的支持,并开始利用数据绑定,这是WPF的一个重要组成部分。此答案演示如何将INotifyPropertyChanged添加到DBContext: