Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make an an item in a Listbox visibile but unclickable

I have Listbox which is bound to my view model. This view model has a property

I need the item to be visible but unclickable with the change of this field. Any suggestion anyone

public interface IRegionAreaDM 
{

    /// <summary>
    /// Name of the Focus Area
    /// </summary>
    string RegionAreaName { get; set; }

    /// <summary>
    /// Determines if the Tab is currently selected.
    /// </summary>
    bool IsSelected { get; set; }

    /// <summary>
    /// Determines if the Tab is linked to any other Tab
    /// </summary>
    bool IsLinked { get; set; }

    /// <summary>
    ///
    /// </summary>
    bool IsActive { get; set; }

}

Each item is connected to an item in the XAML eg Name with a Textbox . IsSelected with a CheckBox and IsActive is to make the ListBoxItems Enabled/Disabled depending on the logic and my Xaml style loooks something like this

 <Style TargetType="ListBoxItem">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="ListBoxItem">
            <Border x:Name="Bd" HorizontalAlignment="Stretch" Background="#00D05252"
                    BorderThickness="0,1" SnapsToDevicePixels="true">
              <!--  <StackPanel x:Name="ParamterRoot" Orientation="Horizontal">  -->
              <Grid x:Name="ParamterRoot">
                <Grid.ColumnDefinitions>
                  <ColumnDefinition Width="Auto" />
                  <ColumnDefinition Width="*" />
                  <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <CheckBox x:Name="ParametersCheckbox" Grid.Column="0" Margin="10,0,0,0"
                          VerticalAlignment="Center" IsChecked="{Binding IsSelected}"
                <TextBlock Grid.Column="1" Width="Auto" Margin="20,7.5,0,7.5"
                           Text="{Binding RegionAreaName}" TextTrimming="CharacterEllipsis">
                  <TextBlock.Style>
                    <Style TargetType="{x:Type TextBlock}">
                      <Style.Triggers>
                        <Trigger Property="IsMouseDirectlyOver" Value="True">
                          <Setter Property="Cursor" Value="Hand" />
                        </Trigger>
                      </Style.Triggers>
                    </Style>
                  </TextBlock.Style>
                </TextBlock>                   
              </Grid>
              <!--  </StackPanel>  -->
            </Border>
            <ControlTemplate.Triggers>
              <Trigger Property="IsMouseOver" Value="true">
                <Setter TargetName="Bd" Property="Background" Value="#FFC10000" />
              </Trigger>
              <Trigger Property="IsSelected" Value="true">
                <Setter TargetName="Bd" Property="Background" Value="#FFC10000" />
              </Trigger>
 <DataTrigger Binding="{Binding IsActive}" Value="False">
                                    <Setter Property="IsEnabled" Value="False" />
                                </DataTrigger>

            </ControlTemplate.Triggers>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
like image 976
Arshad Badar Khan Avatar asked Dec 30 '25 18:12

Arshad Badar Khan


2 Answers

enter image description here

Code Behind: (you are using MVVM so you will adjust this code a little but to fit to your pattern)

public partial class Window1 : Window
{
    public List<T> Items { get; set; }
    public Window1()
    {
        Items = new List<T>
                    {
                        new T{  Id = 1,Name = "qwe",IsEnabled = true},
                        new T{  Id = 2,Name = "asd",IsEnabled = false},
                        new T{  Id = 3,Name = "zxc",IsEnabled = true},
                        new T{  Id = 4,Name = "rty",IsEnabled = false},
                    };
        InitializeComponent();            
        DataContext = this;
    }
}

public class T
{
    public int Id { get; set; }
    public String Name { get; set; }
    public bool IsEnabled { get; set; }
}

XAML:

<ListBox Name="listBox1" ItemsSource="{Binding Items}" DisplayMemberPath="Name">
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="IsEnabled" Value="{Binding IsEnabled,Mode=TwoWay}" />
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

Hope This Help

like image 121
HB MAAM Avatar answered Jan 02 '26 08:01

HB MAAM


if you wanna change something in your style trigger then you have to set this property in your style too! so just add the default IsEnabled setter to your style.

<Style TargetType="ListBoxItem">
   <Setter Property="IsEnabled" Value="True" /><!-- default -->
   ...from here your stuff
like image 35
blindmeis Avatar answered Jan 02 '26 08:01

blindmeis



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!