如何使特定的DataGridTemplate列单元格只读

问题描述 投票:0回答:2

我正在使用数据绑定来填充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成为特定要求。请帮助和指导。

c# wpf
2个回答
0
投票

有许多方法可以完成此操作。一种方法是实现自定义转换器。

[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>

0
投票

您可以在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>
© www.soinside.com 2019 - 2024. All rights reserved.