2016-08-02 55 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 –