首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使列表框中的项可见但不可单击

如何使列表框中的项可见但不可单击
EN

Stack Overflow用户
提问于 2012-05-08 13:17:41
回答 3查看 1.4K关注 0票数 3

我有绑定到我的视图模型的列表框。此视图模型有一个属性

我需要该项目是可见的,但与此字段的变化无法点击。任何人的建议

代码语言:javascript
复制
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; }

}

每个项目都通过一个文本框连接到XAML名称中的一个项目。带有CheckBox和IsActive的IsSelected将根据逻辑启用/禁用ListBoxItems,我的Xaml风格如下所示

代码语言:javascript
复制
 <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>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-08 13:46:37

代码隐藏:(您使用的是MVVM,因此您将稍微调整此代码以适应您的模式)

代码语言:javascript
复制
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:

代码语言:javascript
复制
<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>

希望这对你有所帮助

票数 2
EN

Stack Overflow用户

发布于 2012-05-08 14:11:37

如果你想在你的风格触发器中改变一些东西,那么你也必须在你的风格中设置这个属性!所以只需将默认的IsEnabled设置器添加到您的样式中。

代码语言:javascript
复制
<Style TargetType="ListBoxItem">
   <Setter Property="IsEnabled" Value="True" /><!-- default -->
   ...from here your stuff
票数 1
EN

Stack Overflow用户

发布于 2012-05-09 07:49:10

设置IsEnabled的另一种方法是使用触发器设置UIElement.IsHitTestVisible属性。

代码语言:javascript
复制
 <DataTrigger Binding="{Binding IsActive}" Value="False"> 
    <Setter Property="IsHitTestVisible" Value="False" /> 
 </DataTrigger> 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10492948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档