2016-08-02 27 views
0

具有的DataTemplate两个按钮,一个按钮就可以每行显示,因此,例如,如果Stuaus值为1,则表明按钮1,否则显示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> 

+0

你能转换器添加到资源和状态绑定到按钮的知名度.. –

回答

0

Button小号Visible状态必将给您在身后即代码更新一个布尔值:

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

,并在后面的代码:

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

其中NotifyPropertyChangedPropertyChangedEventHandler周围的包装,它是INotifyPropertyChanged Interface.的一部分

0

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

我通常使用bool to visibility转换器来做到这一点。 这会返回可见性的真实值或可视性值,如果为false。

你可以使用相同的或基于你的状态变量创建你自己的转换器。 例如,如果值== 1,则返回true,否则返回false

1

您可以创建一个转换器并使用转换器参数进行处理。请参阅以下代码。同意@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 
    } 
} 
+0

它说的名字'StatusConverter'没有命名空间中存在吗? – Saif

+0

您需要在xaml中添加名称空间。 –

+0

更新了我的答案..寻找window.xaml –