根据DataGrid SelectedItem属性更改按钮内容

本文关键字:按钮 DataGrid SelectedItem 属性 根据 | 更新日期: 2023-09-27 18:10:40

我有一个WPF窗口和一个视图模型,我需要改变一个按钮的内容,以适应数据网格中SelectedItem的属性。

例如

:
DataGrid绑定到具有两个属性的任务列表:Name和EndDate。如果EndDate为null,我希望按钮显示'结束任务',如果它不是null,显示'恢复任务'
我设法隐藏按钮,如果SelectedItem是空的,但我不能想出一个方法来做到这一点。

这是我为按钮编写的XAML代码:

<DataGrid AutoGenerateColumns="False" 
          ItemsSource="{Binding Tasks}"  
          x:Name="dg" 
          SelectedItem="{Binding SelectedTask}">
          <DataGrid.Columns>
              <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
              <DataGridTextColumn Header="End Date" Binding="{Binding EndDate}"/>
          </DataGrid.Columns>
</DataGrid>
<Button Content="{Binding ButtonText}"
        Name="btn_close_resume"
        Command="{Binding CloseResumeCommand}"
        CommandParameter="{Binding ElementName=dg, Path=SelectedItem}">
        <Button.Style>
            <Style TargetType="Button">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding SelectedTask}" Value="{x:Null}">
                        <Setter Property="IsEnabled" Value="False"></Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
</Button>

ViewModel我有ButtonText属性像这样:

public string ButtonText
{
      get { return this.SelectedTask.EndDate == null ? "Close Task" : "Resume Task"; }
}

但是Button不显示任何文本。
我该怎么做呢?

根据DataGrid SelectedItem属性更改按钮内容

您可以使用另一个DataTrigger来根据SelectedTask EndDate值设置按钮上的内容

<Button
    Name="btn_close_resume"
    Command="{Binding CloseResumeCommand}"
    CommandParameter="{Binding ElementName=dg, Path=SelectedItem}">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="Content" Value="Resume Task"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding SelectedTask}" Value="{x:Null}">
                        <Setter Property="IsEnabled" Value="False"></Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding SelectedTask.EndDate}" Value="{x:Null}">
                        <Setter Property="Content" Value="Resume Task"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

无论如何,你没有说什么是默认值的按钮的内容,当没有选择在datagridview上,按钮会说"Resume Task",直到有东西被选中。如果需要更改这一点,则需要使用转换器。

如果你真的想通过视图模型来做,你必须通知SelectedTask setter中的更改:

 public Task SelectedTask
    {
        get { return selectedTask; }
        set
        {
            selectedTask = value;
            OnPropertyChanged("SelectedTask");
            OnPropertyChanged("ButtonText");
        }
    }

public string ButtonText
{
  get { return this.SelectedTask.EndDate == null ? "Close Task" : "Resume Task"; }
}