根据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不显示任何文本。
我该怎么做呢?
您可以使用另一个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"; }
}