【发布时间】:2015-09-15 13:37:45
【问题描述】:
我有一个ObservableCollection<string> Tags 作为自定义对象的一部分。我将它绑定到DataTemplate,以便使用以下代码向用户显示所有标签:
<StackPanel DockPanel.Dock="Top" Margin="15,0,15,0" Orientation="Horizontal">
<Label Content="Tags:" FontSize="14" Foreground="{StaticResource HM2LightTextBrush}"/>
<Grid>
<ItemsControl Name="PanelPreviewNoteTags" ItemsSource="{Binding ElementName=lbNotesQuickView, Path=SelectedItem.Tags}" Margin="3,0" Visibility="Collapsed">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderThickness="1" BorderBrush="#676B6E" Margin="3,0">
<Label Content="{Binding .,Mode=OneWay}" Foreground="{StaticResource HM2LightTextBrush}"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl Name="PanelEditNoteTags" ItemsSource="{Binding ElementName=lbNotesQuickView, Path=SelectedItem.Tags}" Margin="3,0" Visibility="Collapsed">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderThickness="1" BorderBrush="#676B6E" Margin="3,0">
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding ., Mode=TwoWay}"/>
<Button Style="{StaticResource RibbonButton}" Click="ButtonRemoveTagClick" Tag="{Binding}">
<Image Height="16" Width="16" Source="/Poker Assistant;component/Resources/fileclose.png" />
</Button>
</StackPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</StackPanel>
在ObservableCollection 中添加和删除项目按预期工作。
在代码中,我通过设置对应的PanelEditNoteTags 和PanelPreviewNoteTags 的Visibility 在编辑和查看模式之间切换。这一切都很好并且有效。但是当我进入编辑模式并开始为TextBox 中的标签输入新值时,源代码并没有得到更新。我当然知道当我按下Save 按钮时会引发LostFocus 事件。我尝试了所有UpdateSourceTrigger 值,还是一样。
这是否与同时绑定到相同值的两个控件有关 - 来自PanelPreviewNoteTags 的Label 和来自PanelEditNoteTags 的TextBox?
我在这里错过了什么?
【问题讨论】:
-
绑定到源在没有绑定属性的情况下不起作用。由于您的绑定有
Path=.,因此不会有源更新。有关更多详细信息,请参阅this answer。您必须将ObservableCollection<string>替换为具有可写字符串属性的对象集合。 -
This answer 也可能有帮助。
-
所以我应该使用
ObservableCollection<Tag> Tags而不是ObservableCollection<string> Tags,其中Tag类有一个string Content属性,然后绑定到它。对吗? -
这正是你应该做的。
标签: wpf data-binding textbox datatemplate