如何根据“状态”值仅显示一个按钮
本文关键字:按钮 一个 显示 何根 状态 | 更新日期: 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。
将Button
的Visible
状态绑定到您在代码后面更新的布尔,即:
<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_。