删除列表框WPF中的选择

时间:2018-07-07 10:11:01

标签: c# wpf xaml caliburn.micro

我们使用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>

但是现在双击之后,颜色发生了变化,但是隐藏在选择中,要查看颜色,需要单击其他项。

如何删除选择?

3 个答案:

答案 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实质上禁止了进一步选择。