Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有可编辑文本框的列表框_C#_Wpf_Textbox_Listbox - Fatal编程技术网

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

C# 带有可编辑文本框的列表框,c#,wpf,textbox,listbox,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" > <ListB

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

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

我想改变这个设置的行为,因为它并不是我所需要的。问题是,单击鼠标时,文本框将变得可编辑,但它不是列表框中的选定项。我需要有一种方法来选择项目和另一种方法来编辑它。我的想法是,单击一次,我就将文本框设置为选中项,双击文本框就会变得可编辑。如何实现这一目标,有什么建议吗

ItemTemplates对于这类东西不是很友好,因为它们是数据模板,所以模板中的控件(如TextBox)只知道它绑定到的数据,而不知道它甚至在ListBox中的ListBoxItem中

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

一,。如果您想在文本框获得焦点时自动选择列表框项目:您将需要从文本框到列表框的通信。RoutedEvents冒泡非常适合于此,因为文本框包含在其ListBox项中。因此,TextBox GotFocus routed事件可以由包含它的ListBoxItem看到。您可以覆盖ListBox上的ListBox GetContainerForItemOverride方法,并返回一个自定义ListBoxItem,例如从处理GotFocus RoutedEvent的ListBoxItem派生的MyListBoxItem。自定义ListBoxItem将其IsSelected设置为true;在事件处理程序中。对于选择外观,请使用自定义ListBoxItem ControlTemplate,如下所示


二,。如果要使用一次单击选择,并使用另一次单击在文本框中聚焦:为此,您不必派生自定义LisBoxItem,也不需要使用GetContainerForItemOverride。您可以创建ListBoxItem Controltemplate,并在ContentPresenter周围使用网格/边框或具有填充/边距的其他元素,以便ContentPresenter周围有一个区域,在填充ListBox时,ContentPresenter将自动放置ItemTemplate visual(包括文本框)的位置。看见在ListBoxItem ControlTemplate中,您还可以根据选择的触发器/绑定自定义边框/背景颜色。如果您不希望文本框周围有一个大的边框区域,您可以在ListBoxItem Controltemplate模板中创建一个单独的区域,仅用于选择指示目的。例如,您可以在文本框左侧有一个圆形/矩形,该圆形/矩形的填充颜色基于使用IsSelected属性触发器/绑定修改其填充。

您在堆栈溢出上尝试过这里的搜索功能了吗?有很多宝藏可以找到。。。可能的解决方案会有所不同,这取决于您是喜欢单击一次来选择项目,同时关注文本框,还是喜欢单击两次。例如,请参见以下两个答案:,或