我需要将“编辑所选项目”功能添加到我的列表框中。基本上我需要两个中的任何一个:
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; }
}
那么,你能帮我解决一下这两种解决方案吗?
答案 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
中进行更改。