#wpf #collections #mvvm #visibility
#wpf #Коллекции #mvvm #видимость
Вопрос:
У меня есть эта строка в WPF (.NET 3.5) :
<ListBox ItemsSource="{Binding Locks}" Style="{DynamicResource FancyListBox}" />
Мое желаемое поведение заключается в том, что когда свойство Locks (ObservableCollection) либо равно нулю, либо содержит 0 элементов, вместо ListBox отображается метка, подобная приведенной ниже.
<Label Content="No locks are present" Style="{DynamicResource FancyLabel}" />
Единственное решение, которое я могу придумать на данный момент, — это привязать свойство Locks к видимости с помощью valueconverter (т. Е. преобразователей типа CollectionToVisibilityShowIfNull, CollectionToVisibilityShowIfNotNull), но я не уверен, что это лучшее решение.
... Visibility={Binding Locks, Converter={StaticResource CollectiontoVisibilityShowIfNull}} ..
Спасибо за любую помощь!
Ответ №1:
Вот что я обычно делаю:
<Grid>
<ListBox Name="lstLocks" ItemsSource="{Binding Locks}" Style="{DynamicResource FancyListBox}" />
<Label Name="lblNoLocks" Content="No locks are present" Style="{DynamicResource FancyLabel}" Visibility="Collapsed" />
</Grid>
...
<DataTrigger Binding="{Binding Locks.Count}" Value="0">
<Setter TargetName="lstLocks" Property="Visibility" Value="Collapsed" />
<Setter TargetName="lblNoLocks" Property="Visibility" Value="Visible" />
</DataTrigger>
Комментарии:
1. Я забыл упомянуть, что это происходило в datatemplate, поэтому я не был уверен, сработает ли использование Name, но это сработало! Спасибо тебе, Томас
2. boo, недоступно для WP7 : (
3. Где вы вообще должны добавить DataTrigger? Окно. Триггерам требуются триггеры событий.
4. @TheMuffinMan, вы можете добавить его в DataTemplate или в стиле, в зависимости от ситуации. Но теперь я склонен добавлять определенное свойство в ViewModel и привязывать к нему видимость с помощью BooleanToVisibilityConverter