3

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

我需要随着此字段的更改使该项目可见但不可点击。任何建议任何人

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 中的一个项目,例如带有 Textbox 的名称。IsSelected 与 CheckBox 和 IsActive 是使 ListBoxItems 启用/禁用取决于逻辑和我的 Xaml 样式看起来像这样

 <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>
4

3 回答 3

2

在此处输入图像描述

后面的代码:(您使用的是 MVVM,因此您将稍微调整此代码,但要适合您的模式)

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>

希望这有帮助

于 2012-05-08T05:46:37.193 回答
1

如果您想更改样式触发器中的某些内容,那么您也必须在您的样式中设置此属性!所以只需将默认的 IsEnabled 设置器添加到您的样式中。

<Style TargetType="ListBoxItem">
   <Setter Property="IsEnabled" Value="True" /><!-- default -->
   ...from here your stuff
于 2012-05-08T06:11:36.697 回答
1

设置 IsEnabled 的替代方法是使用触发器设置 UIElement.IsHitTestVisible 属性。

 <DataTrigger Binding="{Binding IsActive}" Value="False"> 
    <Setter Property="IsHitTestVisible" Value="False" /> 
 </DataTrigger> 
于 2012-05-08T23:49:09.703 回答