Wpf XAML中的强制绑定更新

Wpf XAML中的强制绑定更新,wpf,data-binding,xaml,triggers,Wpf,Data Binding,Xaml,Triggers,我有一个视图,其中有一个列表框和几个绑定到列表框中显示的对象属性的文本框。打开时,列表框中填充了数据,我的样式中有以下内容,以确保在有项目且未选择任何内容时,选择第一个项目 <Style.Triggers> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="SelectedItem" Value="{x

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

    <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:

<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>

以下是文本框的一些xaml,该文本框的文本属性绑定到列表视图的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>

你好
世界

列表框中的选定项与文本框之间的关系是如何定义的?文本框位于网格中,其datacontext设置为列表框中的选定项。这种设置有一些奇怪之处。例如。如果列表中只有一个对象,并且它是自动选择的,则文本框保持为空。单击该项不会导致它重新选择该项或任何内容,因此文本框保持为空。如果有两个或两个以上的项目,我可以选择一个项目(不是第一个),一切都按预期进行。文本框使用列表框中所选项目的属性值进行更新。请为我们提供网格上与父datacontext的绑定;据我所知,此设置看起来很好,应该按预期运行。Datacontext代码已发布。我确信这会起作用,但这些是在加载视图时在单独线程中检索的数据对象。因此,在实例化listBox时,通常不会加载对象。看起来由于加载延迟,有某种通知没有发生。