如何根据“状态”值仅显示一个按钮

本文关键字:按钮 一个 显示 何根 状态 | 更新日期: 2023-09-27 17:59:39

数据模板中有两个按钮,每行只能显示一个按钮,因此例如,如果Stuaus值为1,则显示button1,否则显示button2

注意:状态值来自数据库。

我正在使用WPF数据网格:

当前的代码显示两者,我不知道如何根据状态值显示和隐藏按钮。Updated Code:

<DataGridTemplateColumn Header="Fungsi" Width="150" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
  <DataTemplate>
    <StackPanel Orientation="Horizontal">
     <Button Name="btn1" Content="Test1" Background="#FFCC00 "></Button>
     <Button Name="btn2" Content="Test2" Background="Blue"></Button>
    </StackPanel>
  </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

如何根据“状态”值仅显示一个按钮

您可以创建一个转换器并使用转换器参数进行处理。请参阅以下代码。同意@Sam,但如果他有更多的状态,那么下面的代码会有所帮助。

<Window x:Class="DataGrid_Status.Window4"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:DataGrid_Status"
    mc:Ignorable="d"
    Title="Window4" Height="300" Width="300">
<Grid>
    <Grid.Resources>
        <local:StatusConverter x:Key="StatusConverter"></local:StatusConverter>
    </Grid.Resources>
    <DataGrid x:Name="DataGrid" AutoGenerateColumns="False" CanUserAddRows="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
            <DataGridTemplateColumn Header="Fungsi" Width="150" IsReadOnly="True" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Button Name="btn1" Content="Success" Background="Green"
                                    Visibility="{Binding Status,Converter={StaticResource StatusConverter},ConverterParameter=a}"></Button>
                            <Button Name="btn2" Content="InProg" Background="Yellow"
                                    Visibility="{Binding Status,Converter={StaticResource StatusConverter},ConverterParameter=b}"></Button>
                            <Button Name="btn3" Content="Failed" Background="Red"
                                    Visibility="{Binding Status,Converter={StaticResource StatusConverter},ConverterParameter=c}"></Button>
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

    using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace DataGrid_Status
{
    /// <summary>
    /// Interaction logic for Window4.xaml
    /// </summary>
    public partial class Window4 : Window
    {
        public Window4()
        {
            InitializeComponent();
            List<MyClass> lst = new List<MyClass>();
            for (int i = 0; i < 10; i++)
            {
                MyClass obj = new MyClass();
                obj.Name = "Name" + i;
                if (i == 1)
                {
                    obj.Status=StatusEnum.Success;
                }
                else if (i == 2)
                {
                    obj.Status = StatusEnum.Failed;
                }
                else
                {
                    obj.Status = StatusEnum.InProgress;
                }
                lst.Add(obj);
            }
            DataGrid.ItemsSource = lst;
        }
    }
    class StatusConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            StatusEnum status = (StatusEnum)value;
            string param = parameter as string;
            if ((status == StatusEnum.Success && param == "a")|| (status == StatusEnum.InProgress && param == "b")|| (status == StatusEnum.Failed && param == "c"))
            {
                return Visibility.Visible;
            }
            else
            {
                return Visibility.Collapsed;
            }
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    class MyClass
    {
        public string Name { get; set; }
        public StatusEnum Status { get; set; }
    }
    enum StatusEnum
    {
        Success,
        Failed,
        InProgress
    }
}

您必须以某种方式将按钮的可见性绑定到状态。

我通常使用bool-to-visibility转换器来实现这一点。这将返回visible(如果为true)或collapsed(如果为false)的可见性值。

您可以使用相同的转换器,也可以根据状态变量创建自己的转换器。例如,如果值==1,则返回true;如果有其他情况,则返回false。

ButtonVisible状态绑定到您在代码后面更新的布尔,即:

<Button Name="btn1" Content="Test1" Background="#FFCC00 " Visible="{Binding btn1Visible}"/>

在后面的代码中:

public bool btn1Visible
{
     get { return _btn1Visible; }
     set
     {
         _btn1Visible = value;
         NotifyPropertyChanged("btn1Visible");
     }
}

其中CCD_ 5是作为INotifyPropertyChanged接口的一部分的CCD_。