ItemsControl DataContext Binding Error - PullRequest
0 голосов
/ 13 декабря 2011

Я уже изучил это решение: Показать, является ли ItemsControl.ItemsSource нулевым . Я устанавливаю DataContext ItemsControl через codebehind для ObservableCollection. Все работает отлично, за исключением того, что он разрешается только один раз на этапе загрузки. Если у элемента управления есть несколько элементов в начале, текст исчезает, но не появляется позже. Если он пуст, появляется текст, но он не исчезнет, ​​когда я добавлю элементы позже. Я попробовал ItemsSource, но не повезло. Я знаю, что я использую шаблон элемента управления на данный момент, и я могу использовать относительный источник TemplatedParent, но я просто хотел убедиться. После дальнейшего тестирования функция конвертера не активируется после того, как я пытаюсь добавить / удалить элементы в списке, даже если элементы отображаются в моем элементе управления.

<ItemsControl x:Name="MedicationList" ItemTemplate="{StaticResource UserTemplate}">
  <ItemsControl.Template>
    <ControlTemplate TargetType="ItemsControl">
      <Grid>
        <TextBlock Text="No Items to Display" Visibility="{Binding DataContext, ElementName=MedicationList, Converter={StaticResource AnyItemsToVisibilityConverter}}" />
        <ItemsPresenter />
      </Grid>
    </ControlTemplate>     
  </ItemsControl.Template>
</ItemsControl>

1 Ответ

3 голосов
/ 14 декабря 2011

Что вы используете в качестве источника данных / источника данных?Если это ObservableCollection, как я и ожидал, то лучше всего было бы привязать его свойство «Count», а затем использовать триггер, чтобы свернуть текстовый блок при необходимости.

Причина, по которой привязка неВ настоящее время не происходит обновления, что само по себе DataContext фактически не меняется.Свойства DataContext ОБМЕНЯЮТСЯ, поэтому, если вы связываетесь с правильным свойством (числом), ваши привязки будут обновляться.

Этот фрагмент кода должен работать:

<ControlTemplate TargetType="ItemsControl">
  <Grid>
    <TextBlock x:Name="txtBlock" Text="No Items to Display" Visibility="Collapsed" />
    <ItemsPresenter />
  </Grid>
  <ControlTemplate.Triggers>
    <DataTrigger Binding="{Binding Path=Count}" Value="0">
      <Setter TargetName="txtBlock" Property="Visibility" Value="Visible"/>
    </DataTrigger>
  </ControlTemplate.Triggers>
</ControlTemplate>  

Используя данныетриггер, вы можете избежать необходимости конвертера для преобразования числового значения в видимость и сохранения всего в вашем .xaml.

...