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

时间:2015-09-01 16:15:08

标签: c# wpf mvvm datagrid

我有一个WPF窗口和一个Viewmodel,我需要更改按钮的内容以适应Datagrid中SelectedItem的属性。

例如:
DataGrid绑定到具有两个属性的任务列表:Name和EndDate。如果EndDate为空,我希望按钮显示'结束任务,如果它不为空,则显示'恢复任务'
如果SelectedItem为null,我设法隐藏了按钮,但我无法找到实现此目的的方法。

以下是我对该按钮的 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"; }
}

但按钮不显示任何文字 我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

您可以使用另一个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上选择任何内容时,你没有说出按钮内容的默认值是什么,按钮会在选择某个内容之前说“恢复任务”。如果您需要更改此设置,则需要使用转换器。

如果您真的想通过视图模型进行操作,则必须通知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"; }
}