ListBox ItemTemplate中的双向绑定

时间:2014-03-27 07:31:01

标签: wpf binding listbox two-way-binding

我有一个ListBox,其中DataTemplate是可以编辑的TextBox。我应该在哪里设置Binding TwoWay?在ItemSource或In TextBox绑定?也许在两者?它是如何在里面工作的?它是继承的吗?所以,如果我在ItemSource中设置Binding - 它是否在TextBox中继承?

<ListBox HorizontalAlignment="Left" ItemsSource="{Binding Commands, Mode=TwoWay}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Name}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

2 个答案:

答案 0 :(得分:1)

双向绑定应设置为您需要显示的项目,在本例中为文本框。在这里,您需要将耦合返回到您的datacontext。您可能需要考虑将UpdateSourceTrigger属性设置为PropertChanged。 这样,即使不失去焦点,也始终输入文本的值。

itemsource不应该是双向的。一种方法可以做,因为你可能会绑定到一个可观察的集合。这只会从您的datacontext设置一次。这将自动处理向您的收藏中添加和删除项目。

我会像这样添加你的代码:

<ListBox Margin="10,0,0,0" Width="200" HorizontalAlignment="Left"  ItemsSource="{Binding Commands}" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

答案 1 :(得分:1)

  

Where should I set Binding TwoWay?

您应该将此模式设置为TextBox,如下所示:

<TextBox Text="{Binding Path=Name, Mode=TwoWay}" />

如果我没有弄错,则default列出了TwoWay模式的Text属性。因此,不需要它的构造。

来自MSDN

  

在数据绑定方案中使用时,此属性使用UpdateSourceTrigger.LostFocus的默认更新行为。

这意味着可以立即看到属性的更新,您需要将属性UpdateSourceTrigger设置为 PropertyChanged

<TextBox Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

  

So if I set Binding in ItemSource - is it inherited in TextBox?

不,继承不会,因为Binding的设置对每个依赖项属性都是唯一的。使用DataContext时会发生继承,但同样,每个属性的设置都是唯一的。