WPF如何使列表框项可编辑?

时间:2015-05-31 11:33:11

标签: c# wpf xaml listbox

我需要将“编辑所选项目”功能添加到我的列表框中。基本上我需要两个中的任何一个:

  • Ctrl +单击列表项,它神奇地成为可编辑的文本框或其他内容,并在编辑时更新数据库中的数据。

  • 按下ListBox下的“编辑”按钮,打开新的编辑窗口,在那里编辑数据,更新数据库并在编辑窗口关闭时更新ListBox。

我遇到的问题:

  • 我想拥有解决方案的第一个变体,但我真的不知道如何实现它。

  • 实现第二个变体我没有得到如何在新窗口中编辑所选项目后更新ListBox。

这是我的ListBox的XAML:

<Grid>
    <ListBox x:Name="LstQueries" HorizontalAlignment="Left" Height="228" VerticalAlignment="Top" Width="482" FontFamily="HelveticaNeueCyr" FontSize="16" ItemsSource="{Binding Queries}" MouseDoubleClick="LstQueries_MouseDoubleClick">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <Label Content="{Binding Name}" FontWeight="Medium" FontSize="18" FontFamily="Helvetica"/>
                    <TextBlock Text="{Binding Text}" FontSize="16" FontFamily="Helvetica"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <Button x:Name="BtnEdit" Content="Edit" HorizontalAlignment="Left" Margin="0,228,0,0" VerticalAlignment="Top" Width="482" Height="43" Click="BtnEdit_Click"/>
</Grid>

这就是我的编辑窗口XAML:

<Grid>
    <TextBox x:Name="TxtName" HorizontalAlignment="Left" Height="23" Margin="99,13,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="183" FontFamily="HelveticaNeueCyr" FontSize="16"/>
    <Label Content="Name:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" FontFamily="HelveticaNeueCyr" FontSize="16"/>
    <TextBox x:Name="TxtText" HorizontalAlignment="Left" Height="116" Margin="65,45,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="217" FontFamily="HelveticaNeueCyr" FontSize="16"/>
    <Label Content="Text:" HorizontalAlignment="Left" Margin="10,86,0,0" VerticalAlignment="Top" FontFamily="HelveticaNeueCyr" FontSize="16" Height="27" Width="50"/>
    <Button x:Name="BtnSave" Content="Save" HorizontalAlignment="Left" Margin="10,166,0,0" VerticalAlignment="Top" Width="132" Height="33"/>
    <Button x:Name="BtnCancel" Content="Cancel" HorizontalAlignment="Left" Margin="150,166,0,0" VerticalAlignment="Top" Width="132" Height="33" Click="BtnCancel_Click"/>
</Grid>

以下是我如何访问ListBox中的SelectedItem:

if (LstQueries.SelectedIndex < 0) return;
dynamic item = LstQueries.SelectedItem as dynamic;
string name = item.Name;
string text = item.Text;
绑定到listBox的

'查询'是ObservableCollection<Query>,其中Query如下所示:

public class Query
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Text { get; set; }
    public string Autoschool { get; set; }
}

那么,你能帮我解决一下这两种解决方案吗?

2 个答案:

答案 0 :(得分:2)

你可以用不同的方式解决这个问题。 在我写过一次的项目中,我希望双击一个项目,打开该项目的编辑窗口。 我选择使用i.Interaction.Triggers。具体代码如下:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseDoubleClick">
        <Command:EventToCommand Command="{Binding EditExercise_Command}" 
                  CommandParameter="{Binding ElementName=LastExercises_ListView
                                            ,Path=SelectedItem}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

现在,每当我双击一个项目时,它就会打开窗口进行编辑。 这是使用MVVM,所以我不想在我的代码中使用代码。

你必须引用这个dll:system.windows.interactivity.dll,你可能想要阅读一下它们的用法。这是an article about that

这是完整的列表框代码(至少相关位):

   <ListBox x:Name="..."  
              ItemsSource="{Binding FilteredCollection}"
              SelectedItem="{Binding SelectedExercise, UpdateSourceTrigger=PropertyChanged}"
              ...
              >
        <ListBox.ContextMenu>
            <ContextMenu>
                <MenuItem Header ="Edit Exercise"   
                          Command="{Binding EditExercise_Command}" 
                          CommandParameter="{Binding SelectedExercise}"
                />
                <MenuItem Header ="Delete Exercise" 
                          Command="{Binding DeleteExercise_Command}" 
                          CommandParameter="{Binding SelectedExercise}"
                />
            </ContextMenu>
        </ListBox.ContextMenu>

        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick">
                <Command:EventToCommand Command="{Binding EditExercise_Command}" 
                                        CommandParameter="{Binding ElementName=LastExercises_ListView
                                                                 , Path=SelectedItem}" 
                />
            </i:EventTrigger>
        </i:Interaction.Triggers>

    </ListBox>

如果您不想双击,或者如果要删除该项目(使用其他命令),您还可以获得额外的右键菜单选项

答案 1 :(得分:1)

为什么要使用动态?您可以毫无问题地将SelectedItem投射到Query。完成后,您只需将属性加载到编辑窗口并在此处理编辑。

您的查询需要实施INotifyPropertyChanged。否则你不会在ListBox中看到变化(因为控件不知道它们)。 https://msdn.microsoft.com/en-us/library/vstudio/ms229614(v=vs.100).aspx

此外,使用Binding会更容易。不要忘记将绑定模式设置为TwoWay,以便在更改属性后更新属性。 http://blog.scottlogic.com/2012/04/20/everything-you-wanted-to-know-about-databinding-in-wpf-silverlight-and-wp7-part-two.html

为您的窗口。准备单个Query属性(例如,名为SelectedQuery),您可以为其设置所选实例。然后,您可以使用以下内容绑定TextBoxes(在窗口中):Text="{Binding SelectedQuery.Name, Mode="TwoWay"}"。如果您在窗口中正确实施了INotifyPropertyChanged更改文字,请立即在ListView中进行更改。