MVVM WPF заменяет ListBox на Label, когда ItemsSource пуст или равен нулю

#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