如何将所有ListBox项目绑定到同一个属性?

时间:2014-06-16 20:17:07

标签: c# wpf mvvm listbox

我有一个带有以下DataTemplate的 ListBox

        <DataTemplate x:Key="ItemTmp">
        <Border Name="Border" BorderBrush="Aqua" BorderThickness="1" Padding="5" Margin="5">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>

                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding Path=Item1}"></TextBlock>
                <TextBlock Grid.Column="1" Text="{Binding Path=Item2}"></TextBlock>
                <TextBox  Grid.Column="2" Text="{Binding Path=UpdatedGrade,UpdateSourceTrigger=LostFocus,Mode=TwoWay }" />
            </Grid>
        </Border>
    </DataTemplate>
</UserControl.Resources>

意思是,我希望每次用户在其中一个文本框中写入 时,它会更新ViewModel中的相同字段 - UpdatedGrade ,问题是它没有& #39; t work。

当我将单个TextBox绑定到此字段时,它确实有效,例如:

TextBox Grid.Row="3" Text="{Binding Path=UpdatedGrade,UpdateSourceTrigger=LostFocus,Mode=TwoWay }"></TextBox>

有谁知道我该怎么做?

1 个答案:

答案 0 :(得分:1)

ListBox项的DataContext是集合中的单个项,因此它正在尝试查找该项的属性。

只要这不是Windows应用商店应用,您就可以执行以下操作:

Text="{Binding Path=DataContext.UpdatedGrade, UpdateSourceTrigger=LostFocus, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=UserControl}}"

使用win8应用程序,您无法轻松找到祖先,因此您必须提供包含上下文的元素的名称

Text="{Binding Path=DataContext.UpdatedGrade, UpdateSourceTrigger=LostFocus, Mode=TwoWay, ElementName=MyUserControl}"

我不确定这会如何行动 - 直接绑定到文本框 - 它可能会更新DataContext中的UpdatedGrade,但是我再次确定。

Text="{Binding Path=Text, UpdateSourceTrigger=LostFocus, Mode=TwoWay, ElementName=MyTextBox}"