我有动态列表框绑定了observable集合,并包含显示列表属性的文本框。我希望“添加新标签”作为列表框的最后一项,然后单击标签将变为与列表框数据模板绑定的文本框。所以视觉结构是这样的:
场景1:当列表框中没有项目时:
列表框:
场景2:当列表框中有3个项目时:
列表框:
当用户点击添加新项目时,该标签应替换为文本框,用户可以在其中添加新项目。并且“添加新项目”标签向下移动了一步。
任何人都知道如何在WPF中做到这一点?
我的代码:
<ListBox Name="ListUrls" ItemsSource="{Binding . ,Source=ListSourceCollection,BindsDirectlyToSource=True, UpdateSourceTrigger=PropertyChanged}"
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="30" />
<ColumnDefinition Width="30"/>
</Grid.ColumnDefinitions>
<RadioButton>
<WrapPanel>
<TextBox Name="TextBoxList" Text="{Binding Path=urlString, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" Focusable="{Binding IsEditing}" FocusableChanged="TextBoxList_FocusableChanged" Background="Transparent" Margin="0" BorderThickness="0" Width="150" Foreground="Gray" MouseEnter="TextBoxList_MouseEnter" MouseLeave="TextBoxList_MouseLeave">
</TextBox>
</WrapPanel>
</RadioButton>
<ToggleButton Name="EditButton" Content="Edit" Grid.Column="1" Click="Button_Click" IsChecked="{Binding IsEditing}" HorizontalAlignment="Right" Margin="0">
<ToggleButton.Style>
<Style TargetType="ToggleButton">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsEditing}" Value="False"></Condition>
<Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}, AncestorLevel=1}, Path=IsSelected}" Value="True"></Condition>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Visibility" Value="Visible"/>
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</ToggleButton.Style>
</ToggleButton>
<Button Content="Delete" Grid.Column="2" Click="Button_Click_1" HorizontalAlignment="Right" Margin="0">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsEditing}" Value="False"></Condition>
<Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}, AncestorLevel=1}, Path=IsSelected}" Value="True"></Condition>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Visibility" Value="Visible"/>
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
答案 0 :(得分:1)
拥有&#34;静态&#34;您需要的ListView
中的媒体资源:
<CollectionViewSource Source="{Binding ObservableCollection}" x:Key="requiredList"/>
在您ListView
ItemsSource
中指定<ListView.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource requiredPeople}}"/>
</CompositeCollection>
</ListView.ItemsSource>
<Button Content="Add new Item" Command="..." ComandParameter="..."/>
:
VM
我无法记住你是否需要在ListViewItem中包装按钮。
请记住,ICommand
上需要临时字段才能将其绑定到DataTemplate。
您还需要VM
Source
,这样您就可以在处理命令时将新项目添加到集合中。
注意:强>
这是我的头脑,我不保证这会有效,但它应该让你知道如何解决这个问题。
的修改
而不是Collection
中CollectionContainer
使用{{1}}。