可编辑的WPF ListBox包含文本框

时间:2014-06-03 17:29:19

标签: wpf data-binding textbox listbox

我想在wpf应用程序中拥有动态可编辑列表框。我在listbox中使用文本框,我将Observable集合绑定到该列表框。现在,我想在鼠标单击时使文本框可编辑。因此,用户可以更改文本框并保存新的文本框文本。

         <ListBox Name="ListTwo" ItemsSource="{Binding CollectionUrl, Mode=TwoWay}"  >
         <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBox Name="TextBoxList" Text="{Binding Path=urlString}" IsEnabled="False" >
                </TextBox>
            </DataTemplate>

        </ListBox.ItemTemplate>

        </ListBox>

2 个答案:

答案 0 :(得分:1)

您应该使用IsReadOnly属性。在触发器中,您应该检查IsFocused属性。

在以下示例中,我更改了前景色以指示哪个TextBox处于编辑模式。

示例:

<ListBox Name="ListTwo" ItemsSource="{Binding CollectionUrl, Mode=TwoWay}"  >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBox Name="TextBoxList" Text="{Binding Path=urlString}" MinWidth="100">
                <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="Red"/>
                                <Setter Property="IsReadOnly" Value="True" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </TextBox.Style>
            </TextBox>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

如果您希望允许用户在TextBox中编辑值后保存更改,您可以在实际编辑行中添加按钮并显示:

<ListBox Name="ListTwo" ItemsSource="{Binding CollectionUrl, Mode=TwoWay}"  >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="50" />
                </Grid.ColumnDefinitions>
                <TextBox Name="TextBoxList" Text="{Binding Path=urlString}" MinWidth="100">
                    <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="Red"/>
                                    <Setter Property="IsReadOnly" Value="True" />
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </TextBox.Style>
                </TextBox>
                <Button Content="Save" Grid.Column="1" Command="{Binding SaveChanges}">
                    <Button.Style>
                        <Style TargetType="Button">
                            <Setter Property="Visibility" Value="Collapsed" />
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding ElementName=TextBoxList, Path=IsFocused}" Value="True">
                                    <Setter Property="Visibility" Value="Visible" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Button.Style>
                </Button>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

答案 1 :(得分:0)

我访问文本框的方法(这证明是一场噩梦)是使用你的保存按钮方法,在Button的Button_Click函数中,我使用发件人来检索Button的父级,强制转换为(在你的情况下)网格。然后你可以使用它来访问Grid的孩子,其中.Children [0]是你的TextBox。 因为你的代码必须知道&#39;父类型和子TextBox的索引但这些不会改变。如果有必要,纯粹主义者可以遍历儿童,明确地识别所需的孩子。 希望这有助于某人。