我们使用Caliburn Micro。 我需要在mouseDoubleClick之后更改项目的颜色。
A这样做:
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<DataTrigger Binding="{Binding AnswerStatus, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Value="1">
<Setter Property="Background" Value="DarkSeaGreen"/>
<Setter Property="FontWeight" Value="Bold"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding AnswerStatus, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Value="2">
<Setter Property="Background" Value="IndianRed"/>
<Setter Property="FontWeight" Value="Bold"></Setter>
</DataTrigger>
</Style.Triggers>
<Setter Property="cal:Message.Attach" Value="[Event MouseDoubleClick] = [Action AnswerDoubleClick($dataContext)]"/>
</Style>
</ListBox.ItemContainerStyle>
但是现在双击之后,颜色发生了变化,但是隐藏在选择中,要查看颜色,需要单击其他项。
如何删除选择?
答案 0 :(得分:0)
使用ItemsControl而不是列表框。 ItemsControl不支持选择。
答案 1 :(得分:0)
我对caliburn.micro不熟悉,因此下面是通用的wpf / xaml。
如果您在xaml中将列表框定义为:
<ListBox Name="TheList" MouseDoubleClick="TheList_MouseDoubleClick" DisplayMemberPath="AsString">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<DataTrigger Binding="{Binding AnswerStatus, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Value="1">
<Setter Property="Background" Value="DarkSeaGreen"/>
<Setter Property="FontWeight" Value="Bold"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding AnswerStatus, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Value="2">
<Setter Property="Background" Value="IndianRed"/>
<Setter Property="FontWeight" Value="Bold"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
将MouseDoubleClick处理程序定义为:
private void TheList_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
MyItem item = TheList.SelectedItem as MyItem;
if (item != null)
{
item.SwapStatus();
TheList.SelectedIndex = -1;
}
}
}
您的列表框项目视图模型为:
public class MyItem : INotifyPropertyChanged
{
private int m_value;
public int Value
{
get { return m_value; }
set
{
m_value = value;
OnPropertyChanged("Value");
OnPropertyChanged("AsString");
}
}
public string AsString
{
get
{
return ToString();
}
}
private int m_answerStatus;
public int AnswerStatus
{
get { return m_answerStatus; }
set
{
m_answerStatus = value;
OnPropertyChanged("AnswerStatus");
OnPropertyChanged("AsString");
}
}
public void SwapStatus()
{
AnswerStatus = m_answerStatus == 1 ? 2 : 1;
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
public override string ToString()
{
return $"MyItem: {Value} {AnswerStatus}";
}
}
({TheList.ItemsSource = Enumerable.Range(1, 5).Select(i => new MyItem { Value = i, AnswerStatus = i % 2 + 1 });
)
它将起作用。
答案 2 :(得分:0)
这对我有用。
列表框资源中的绑定IsSelected
属性:
<ListBox.Resources>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
</Style>
</ListBox.Resources>
现在只要将其设置为IsSelected = false
即可,并且您已经准备就绪。
就我而言,我需要一个列表,一旦选定项目的数量达到某个预定义的数量,就无法再选择任何项目。因此,在我的情况下,我在SelectChanged
事件处理程序中设置了条件,如果不满足条件,则通过将所选项目的IsSelected设置为false实质上禁止了进一步选择。