我有一个绑定到我的视图模型的Listbox。此视图模型具有属性
我需要让这个项目可见,但是在更改此字段时无法点击。任何人的建议
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选择IsSective,并根据逻辑使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>
答案 0 :(得分:2)
Code Behind :(您正在使用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>
希望这个帮助
答案 1 :(得分:1)
如果你想改变你的风格触发器中的某些内容,那么你必须在你的风格中设置这个属性!所以只需将默认的IsEnabled setter添加到您的样式中。
<Style TargetType="ListBoxItem">
<Setter Property="IsEnabled" Value="True" /><!-- default -->
...from here your stuff
答案 2 :(得分:1)
设置IsEnabled woudld的另一种方法是使用触发器来设置UIElement.IsHitTestVisible属性。
<DataTrigger Binding="{Binding IsActive}" Value="False">
<Setter Property="IsHitTestVisible" Value="False" />
</DataTrigger>