Принудительное обновление привязки в XAML - PullRequest
1 голос
/ 14 сентября 2010

У меня есть представление со списком и несколько текстовых полей, привязанных к свойствам объектов, отображаемых в списке.При открытии список заполняется данными, и у меня есть следующее в стиле, чтобы убедиться, что когда есть элементы и ничего не выбрано, чтобы выбрать 1-й элемент.

    <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 (через их текст данных родительских сеток), не отображаютсядля получения уведомления.

Любой знает способ заставить их обновить (в XAML, если это возможно).В настоящее время привязки выглядят так:

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

Любая помощь будет принята с благодарностью.

Кори

================= Редактировать ====================

Ниже приведен XAML, показывающий сетку PackageDetailsGrid с использованием PackageList SelectedItem в качестве контекста данных:

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

1 Ответ

0 голосов
/ 14 сентября 2010

Вот некоторые 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>
...