我有一个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"; }
}
但按钮不显示任何文字 我怎么能这样做?
答案 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"; }
}