首页 > 解决方案 > 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>

标签: c#wpfmvvmdatagrid

解决方案


我建议你做这些改变:

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;
       }
   }

然后在你的FilePathorShortcutName设置中(我不知道哪个是用来改变按钮状态的)只要提高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 后创建这个新类并调用该方法。


推荐阅读