2010-09-14 2 views
1

У меня есть вид со списком и несколькими текстовыми полями, привязанными к свойствам объектов, отображаемых в списке. При открытии список заполняется данными, и для этого в следующем стиле есть следующее, чтобы гарантировать, что, когда есть элементы и ничего не выбрано, выберите 1-й элемент.Обновление привязки привязки в 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}" /> 

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

Cory

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

Ниже XAML, показывающий сетки PackageDetailsGrid с помощью PackageList SelectedItem, как это 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

+0

Текстовое поле находится в сетке с установленным параметром datacontext выбранному элементу в ListBox. В этой настройке есть некоторые странности. Например. Если в списке есть только один объект, и он автоматически выбирается, текстовые поля остаются пустыми. Щелчок по элементу не вызывает его повторного выбора или чего-либо другого, поэтому текстовые поля остаются пустыми. Если есть два или более элемента, я могу выбрать элемент (не первый), и все работает так, как ожидалось. Текстовые поля обновляются с помощью значений свойств из выбранного элемента в списке. – CodeWarrior

+0

Пожалуйста, дайте нам привязку к сетке с родительским текстом datacontext; насколько я могу это сказать, эта настройка выглядит нормально и должна вести себя так, как ожидалось. –

ответ

0

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

Смежные вопросы