XAML中的强制绑定更新

问题描述:

我有一个带有列表框的视图和几个绑定到列表框中显示的对象属性的文本框。在打开时,列表框中填充了数据,并且在样式中我保留了以下内容,以确保比选择项目时没有任何内容选择第一项。XAML中的强制绑定更新

<Style.Triggers> 
     <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="SelectedItem" Value="{x:Null}"/> 
       <Condition Property="HasItems" Value="True"/> 
      </MultiTrigger.Conditions> 
      <Setter Property="SelectedIndex" Value="0"/> 
     </MultiTrigger> 
    </Style.Triggers> 

这是有效的。列表中的第一个项目在填充列表时总是被选中。

不幸的是,尽管第一项选择,似乎是被绑定到selectedItems特性(通过他们的父母网格的DataContext)文本框不接收通知。

任何人都知道的一种方式(如果可能的话在XAML),迫使他们更新。目前,绑定看起来如此:

<TextBox Text="{Binding Weight, ConverterParameter=\{0:F\}, Converter={StaticResource FormattingConverter}, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" /> 

任何帮助将不胜感激。

科里斯

=================编辑====================

下面是使用了PackageList的SelectedItem电网PackageDetailsGrid的XAML,因为它的DataContext的:

<StackPanel Orientation="Vertical" d:LayoutOverrides="Height"> 
    <TextBlock Text="Packages" Style="{DynamicResource TitleText}"/> 
    <ListBox x:Name="PackageList" Style="{StaticResource SnazzyList}" FocusVisualStyle="{x:Null}" Margin="0" ItemsSource="{Binding Source={StaticResource Packages}}" HorizontalContentAlignment="Stretch" Height="132.5" Background="#18000000"> 
    </ListBox> 
    <Grid Margin="0,0,8,0"> 
     <Button Content="Add" Margin="20,0,0,0" Width="87" HorizontalAlignment="Left" Style="{DynamicResource ClearButton}" Command="{Binding AddPackageCommand}" Visibility="{Binding ShipmentRecord.TransitStatus, Converter={StaticResource ShippedToVisibilityConverter}}"/> 
     <Button Content="Delete" Margin="0,0,20,0" Style="{DynamicResource ClearButton}" HorizontalAlignment="Right" Width="87" Height="21.4666666666667" Command="{Binding DeletePackageCommand}" CommandParameter="{Binding SelectedItem, ElementName=PackageList, Mode=Default}" Visibility="{Binding ShipmentRecord.TransitStatus, Converter={StaticResource ShippedToVisibilityConverter}}"/> 
    </Grid> 
</StackPanel> 
<Grid x:Name="PackageDetailsGrid" Margin="0" Grid.Column="1" DataContext="{Binding Items.CurrentItem, ElementName=PackageList, Mode=Default}"> 
    <StackPanel Margin="0"> 
     <Grid Margin="0,0,0,8"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="40*"/> 
       <ColumnDefinition Width="60*"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="Dimensions" Foreground="White" FontWeight="Bold"/> 
      <StackPanel Grid.Column="1" Orientation="Horizontal" d:LayoutOverrides="Height"> 
       <TextBox Text="{Binding Height, ConverterParameter=\{0:F\}, Converter={StaticResource FormattingConverter}, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" Width="48" TextWrapping="Wrap" Margin="0" HorizontalAlignment="Left" IsEnabled="{Binding CanEnterPackageDetails}"> 
        <i:Interaction.Behaviors> 
         <local:SelectAllOnFocusTextboxBehavior/> 
        </i:Interaction.Behaviors> 
       </TextBox> 
       <TextBlock Text="X" Style="{DynamicResource XTextBlockStyle}"/> 
       <TextBox Text="{Binding Width, ConverterParameter=\{0:F\}, Converter={StaticResource FormattingConverter}, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" Width="48" TextWrapping="Wrap" Margin="0" HorizontalAlignment="Left" IsEnabled="{Binding CanEnterPackageDetails}"> 
        <i:Interaction.Behaviors> 
         <local:SelectAllOnFocusTextboxBehavior/> 
        </i:Interaction.Behaviors> 
       </TextBox> 
       <TextBlock Text="X" Style="{DynamicResource XTextBlockStyle}"/> 
       <TextBox Text="{Binding Length, ConverterParameter=\{0:F\}, Converter={StaticResource FormattingConverter}, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" Width="48" TextWrapping="Wrap" Margin="0" HorizontalAlignment="Left" IsEnabled="{Binding CanEnterPackageDetails}"> 
        <i:Interaction.Behaviors> 
         <local:SelectAllOnFocusTextboxBehavior/> 
        </i:Interaction.Behaviors> 
       </TextBox> 
      </StackPanel> 
     </Grid> 
    </StackPanel> 
</Grid> 
+0

如何定义列表框中的所选项目和文本框之间的关系? – Timores 2010-09-14 15:26:10

+0

该文本框位于网格中,其datacontext设置为ListBox中的Selected Item。这种设置有一些奇怪之处。例如。如果列表中只有一个对象,并且它被自动选中,则文本框保持空白。点击该项目不会导致它重新选择它或任何东西,所以文本框保持空白。如果有两个或更多的项目,我可以选择一个项目(不是第一个),一切都按预期工作。文本框使用列表框中所选项目的属性值进行更新。 – CodeWarrior 2010-09-14 17:14:08

+0

请给我们与父datacontext网格上的绑定;据我所知,这种设置看起来不错,应该按预期行事。 – 2010-09-14 17:35:07

下面是一些XAML的一个TextBox,其Text属性绑定到列表视图的SelectedItem属性。它包括您没有选择任何内容时用于自动选择第一个项目的代码。

这是您正在寻找的解决方案吗?如果没有,我需要更多的信息,即所有你正在处理的相关代码。

<StackPanel> 
    <TextBox Text="{Binding SelectedItem, ElementName=MyListView}" /> 

    <ListView x:Name="MyListView"> 
     <ListView.Style> 
      <Style TargetType="ListView"> 
       <Style.Triggers> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="SelectedItem" Value="{x:Null}"/> 
          <Condition Property="HasItems" Value="True"/> 
         </MultiTrigger.Conditions> 
         <Setter Property="SelectedIndex" Value="0"/> 
        </MultiTrigger> 
       </Style.Triggers> 
      </Style> 
     </ListView.Style> 

     <ListView.Items> 
      <System:String>hello</System:String> 
      <System:String>world</System:String> 
     </ListView.Items> 
    </ListView> 
</StackPanel> 
+0

我确定这可以工作,但这些数据对象是在视图加载时在单独的线程中检索的。因此,当listBox被实例化时,对象通常不会被加载。它看起来像是由于加载被延迟,有某种通知没有发生。 – CodeWarrior 2010-09-14 17:16:29