c# - Datagrid更改时如何启用按钮?
问题描述
当 Datagrid 中的任何数据发生更改时,如何启用按钮?
<DataGrid x:Name="GlobalShortcutsDataGrid"
ItemsSource="{Binding GlobalShortcutsObservableCollection}"
SelectedItem="{Binding SelectedRow}"
AutoGenerateColumns="False">
<DataGrid.Columns >
<DataGridTextColumn Header="Shortcut Name" Binding="{Binding ShortcutName}"></DataGridTextColumn>
<DataGridTextColumn Header="Shortcut Path" Binding="{Binding FilePath}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<Button x:Name="buttonSave" IsEnabled="False"
Command="{Binding SaveCommand}"
Content="Save Edits">
<Button.Style>
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
<Style.Triggers>
// I'm not sure how to check for datagrid changes here
</Style.Triggers>
</Style>
</Button.Style>
</Button>
解决方案
我建议你做这些改变:
XAML
<DataGrid x:Name="GlobalShortcutsDataGrid"
ItemsSource="{Binding GlobalShortcutsObservableCollection}"
SelectedItem="{Binding SelectedRow}"
AutoGenerateColumns="False">
<DataGrid.Columns >
<DataGridTextColumn Header="Shortcut Name" Binding="{Binding ShortcutName}"></DataGridTextColumn>
<DataGridTextColumn Header="Shortcut Path" Binding="{Binding FilePath}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<Button x:Name="buttonSave" IsEnabled="{Binding IsButtonSaveEnabled}"
Command="{Binding SaveCommand}"
Content="Save Edits"/>
你的虚拟机
创建新的 bool 属性:
public bool IsButtonSaveEnabled
{
get
{
return yourLogicToBeEnabled;
}
}
然后在你的FilePath
orShortcutName
设置中(我不知道哪个是用来改变按钮状态的)只要提高IsButtonSaveEnabled
.
编辑:更改了 XAML,因为我认为您想隐藏它而不是更改启用状态。只需卸下转换器。
编辑:为了解决您的情况,我将创建一个像这样的类:
public class YourParentVMDataSource
{
private YourParentVM yourParentVM;
private GlobalShortcutsVM globalShorcutsVM;
public YourParentVMDataSource(GlobalShortcutsVM globalShortcutsVm, YourParentVM yourParentVM)
{
this.globalShorcutsVM = globalShortcutsVm;
this.yourParentVM = yourParentVM;
}
public void CreateDataSource()
{
this.globalShorcutsVM.Model.PropertyChanged += this.OnGlobalShortcutsModelPropertyChanged
}
private void OnGlobalShortcutsModelPropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "ShortcutName":
this.yourParentVM.RaisePropertyChanged("IsButtonSaveEnabled");
break;
case "FilePath":
this.yourParentVM.RaisePropertyChanged("IsButtonSaveEnabled");
break;
}
}
}
yourParentVM
你的“主要”虚拟机在哪里,是GlobalShortcutsVM
我认为你用来填充的虚拟机DataGrid
(你应该有一个ObservableCollection<GlobalShortcutsVM> GlobalShortcutsObservableCollection
)
每当您的 GlobalShortcutsObservableCollection 模型发生变化时,它都会引发事件并由您处理。在处理程序中,您提高父 VM 的属性。
CreateDataSource
您应该在创建“主”VM 后创建这个新类并调用该方法。
推荐阅读
- flutter - 颤振测试应该保存在哪里
- swift - 使用实时更新 Firestore 仅获取几个数据
- sun-codemodel - 如何使用 CodeModel 初始化二维数组
- python - 如何比较两个numpy数组中的元素并添加其他元素?
- spring-boot - Spring boot:从 jar 依赖项中解析 JSP
- java - 限制 Java HashMap 中 get 方法的对象类型
- pydicom - 从 pydicom 获取数据的问题
- ruby-on-rails - 为 rails 模型实现条件状态机
- c# - Visual Studio 2019 无法向我的项目添加新文件
- git - 如何每天从 gerrit 服务器获取精心挑选的提交 ID