带有可编辑文本框的列表框

时间:2017-06-11 19:27:30

标签: c# wpf textbox listbox

我创建了一个带有可编辑文本框的列表框。代码如下所示:

<ListBox Name="subjects_list" Margin="74,154,1039,171" ItemsSource="{Binding ElementName=styles_list, Path=SelectedItem.subjects, Mode=TwoWay}" HorizontalContentAlignment="Stretch" BorderThickness="0" >
   <ListBox.ItemTemplate>
      <DataTemplate>
          <TextBox Name="TextBoxList" Text="{Binding name}" BorderThickness="1" Background="#FFD3E1FF" BorderBrush="#FFA0B8FF" >
             <TextBox.Style>
                <Style TargetType="TextBox">
                   <Style.Triggers>
                      <Trigger Property="IsFocused" Value="True">
                         <Setter Property="Foreground" Value="Green"/>
                         <Setter Property="IsReadOnly" Value="False" />
                      </Trigger>
                      <Trigger Property="IsFocused" Value="False">
                         <Setter Property="Foreground" Value="Black"/>
                         <Setter Property="IsReadOnly" Value="True" />
                      </Trigger>
                   </Style.Triggers>
                </Style>
             </TextBox.Style>
          </TextBox>
       </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

我想更改此设置的行为,因为事实证明这不是我需要的。问题是,在鼠标单击时,文本框变为可编辑,但它不是列表框中的选定项。我需要有一种方法来选择项目和另一种方式来编辑它。我的想法是,只需单击一下,我就可以将文本框设置为选定项目,双击文本框即可编辑。任何建议如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

ItemTemplates对于这种事情不是很友好,因为它们是一个DataTemplate,所以模板中的控件(例如你的TextBox)只知道它绑定的数据,而且它甚至在ListBoxItem中的事实都没有在ListBox中。

但是,有几种方法可以做到这一点。通常,对于大多数控件,使用ListBox GetContainerForItemOverride()方法来使用自定义ListBoxItem。

<强> 1。如果要在TextBox获得焦点时自动选择列表框项目:您将需要&#34;通信&#34;从TextBox到ListBox。 RoutedEvents(冒泡)非常适合这种情况,因为TextBox包含在ListBox项中。因此,包含它的ListBoxItem可以看到TextBox GotFocus路由事件。您可以覆盖ListBox上的ListBox GetContainerForItemOverride()方法,并返回处理GotFocus RoutedEvent的自定义ListBoxItem(例如,从ListBoxItem派生的MyListBoxItem)。自定义ListBoxItem将设置其IsSelected = true;在事件处理程序中。对于选择外观,请使用自定义ListBoxItem ControlTemplate,如下面的#2所示。

<强> 2。如果您想使用一次单击选择并使用另一次单击在TextBox中聚焦:为此,您不一定需要派生自定义LisBoxItem,也不需要使用GetContainerForItemOverride()。您可以创建一个ListBoxItem Controltemplate并在ContentPresenter周围使用网格/边框或其他元素,并使用填充/边距,以便ContentPresenter周围有一些区域(ContentPresenter是您的ItemTemplate视觉效果,包括您的TextBox)填充ListBox时自动运行)。见MSDN ListBoxItem ControlTemplate。在ListBoxItem ControlTemplate中,您还可以根据IsSelected触发器/绑定自定义边框/背景颜色。如果您不希望TextBox周围有大的边框区域,您可以在ListBoxItem Controltemplate模板中创建一个单独的区域,仅用于选择指示。例如,您可以在TextBox的左侧有一个圆/矩形,它具有填充颜色,基于使用IsSelected属性Trigger / Binding修改其填充。