我正在使用数据绑定来填充wpf应用程序中的表。我还添加了一个按钮,以通过以下代码执行进一步的操作:
<DataGrid x:Name="DispJob" ItemsSource ="{Binding}" AutoGenerateColumns="False" Height="425" Margin="-10,26,0,20" IsReadOnly="True" Width="1000" HorizontalAlignment="Left" CanUserResizeColumns="True" CanUserSortColumns="True" >
<DataGrid.Columns>
<DataGridTextColumn Header="Job Name" Binding="{Binding Path=JobName}"/>
<DataGridTextColumn Header="Job Type" Binding="{Binding Path=JobType}"/>
<DataGridTextColumn Header="URL" Binding="{Binding Path=URL}"/>
<DataGridTextColumn Header="Username" Binding="{Binding Path=Username}"/>
<DataGridTextColumn Header="Current Status" Binding="{Binding Path=CurrentStatus}"/>
<DataGridTextColumn Header="Last Execution Status and time" Binding="{Binding Path=LastStatus}"/>
<DataGridTextColumn Header="Next Execution time" Binding="{Binding Path=NextStatus}"/>
<DataGridTextColumn Header="Update" Binding="{Binding Path=Update}"/>
<DataGridTemplateColumn Header="Update">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate x:Name="Button_Update_Temp">
<Button x:Name="btnUpdate" Content="Update" Click="btnUpdate_Click"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
现在,如果登录的用户名与该列中显示的用户名不同,则通过验证条件来使按钮属性IsEnabled = false成为特定要求。请帮助和指导。
有许多方法可以完成此操作。一种方法是实现自定义转换器。
[ValueConversion(typeof(string), typeof(bool))]
public class UsernameToEnabledConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
var username = value.ToString();
// The GetCurrentUserName() method is your way to get the current logged user name.
if (username == GetCurrentUserName()) {
return true;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
throw new NotSupportedException();
}
}
然后,将Button.IsEnabled属性绑定到Username属性,并使用转换器(我只输入了重要的代码):
<Window
...
<Window.Resources>
<local:UsernameToEnabledConverter x:Key="UsernameToEnabledConverter" />
</Window.Resources>
<Grid>
<DataGrid
...
ItemsSource="{Binding}">
<DataGrid.Columns>
...
<DataGridTextColumn Binding="{Binding Path=Username}" Header="Username" />
...
<DataGridTemplateColumn Header="Update">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate x:Name="Button_Update_Temp" DataType="local:CustomVm">
<Button
x:Name="btnUpdate"
Click="btnUpdate_Click" Content="Update"
IsEnabled="{Binding Username, Converter={StaticResource UsernameToEnabledConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
您可以在CellStyle
中定义DataGridTemplateColumn
,并通过使用触发器可以设置此单元格的属性IsEnabled
:
<DataGrid x:Name="DispJob" ItemsSource ="{Binding}" AutoGenerateColumns="False" Height="425" Margin="-10,26,0,20" IsReadOnly="True" Width="1000" HorizontalAlignment="Left" CanUserResizeColumns="True" CanUserSortColumns="True" >
<DataGrid.Columns>
<DataGridTextColumn Header="Job Name" Binding="{Binding Path=JobName}"/>
<DataGridTextColumn Header="Job Type" Binding="{Binding Path=JobType}"/>
<DataGridTextColumn Header="URL" Binding="{Binding Path=URL}"/>
<DataGridTextColumn Header="Username" Binding="{Binding Path=Username}"/>
<DataGridTextColumn Header="Current Status" Binding="{Binding Path=CurrentStatus}"/>
<DataGridTextColumn Header="Last Execution Status and time" Binding="{Binding Path=LastStatus}"/>
<DataGridTextColumn Header="Next Execution time" Binding="{Binding Path=NextStatus}"/>
<DataGridTextColumn Header="Update" Binding="{Binding Path=Update}"/>
<DataGridTemplateColumn Header="Update">
<DataGridTemplateColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="IsEnabled" Value="False"/>
<Style.Triggers>
<DataTrigger Binding="{Binding CurrentStatus}" Value="LoggedIn">
<Setter Property="IsEnabled" Value="True"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate x:Name="Button_Update_Temp">
<Button x:Name="btnUpdate" Content="Update" Click="btnUpdate_Click" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>