2016-03-23 3 views
0

Я пишу приложение uwp. На главной странице есть список. Каждый элемент списка отображает строку текста и кнопку. Видимость кнопки «рухнула», и я хочу изменить ее видимость на «видимый», когда элемент выбран.UWP - проблема видимости кнопки ListBoxItem

Как есть стиль не вызывает в UWP, до сих пор я попытался с помощью VisualStateManager в пределах DataTemplate в ListBox «s ItemTemplate определения. Это не сработало.

Я пробовал использовать VisualStateManager с определением ListBox's ItemContainerStyle. Это тоже не сработало.

Мне кажется, что очень просто хотеть делать, но я не могу найти способ сделать это. У кого-нибудь есть идеи?

+0

Вы используете MVVM? –

ответ

0

вы можете использовать DataTriggerBehaviors и ChangePropertyAction, чтобы изменить видимость вашей кнопки, если вы используете MVVM и Binding подход

Вам необходимо установить пакет NuGet Microsoft.xaml.behaviors.uwp.managed

https://www.nuget.org/packages/Microsoft.Xaml.Behaviors.Uwp.Managed/

или самый простой способ открыть свою страницу или UserControl с помощью Blend и найти, что поведение и смесь будут установлены для ваших необходимых пакетов для ее использования.

https://blogs.msdn.microsoft.com/wsdevsol/2014/12/10/using-a-datatriggerbehavior-to-change-an-itemtemplate-in-a-windows-store-app/

Обновление:

Вы не можете использовать VisualStateManager внутри ItemDataTemplate не поддерживается, но там делать некоторые трюки, чтобы использовать его

AdaptiveTrigger and DataTemplate

+0

Привет, Рикардо, Большое спасибо за ваш ответ. Я раньше не слышал о DataTriggerBehaviors, и ваша ссылка содержит очень ценную информацию о том, как обойти мою проблему, поэтому большое вам спасибо. Я все еще очень запутался в роли VisualStateManager и почему он, похоже, не работает так, как предполагает документация. У вас есть идеи об этом? – RobDev

+0

Я обновил свой ответ – RicardoPons

+0

Привет, Рикардо, Я попытался использовать UserControl внутри моего DataTemplate, но это тоже не сработало для меня. Я пытаюсь использовать метод DataTriggerBehaviors (в вашей ссылке), но у меня есть несколько проблем, связанных с VS 2015: «Имя« Взаимодействие »не существует в пространстве имен« с использованием: Microsoft.Xaml.Interactivity »- что соответствует к обозревателю объектов. Есть еще несколько других имен «не существует» - не знаю, что здесь происходит. – RobDev

0

Если вы используете модель MVVM, вы можете добавить дополнительные IsSelected свойства к своим предметам, которые вы связываете с ListBox:

public bool IsSelected 
{ 
    get { return _isSelected; } 
    set 
    { 
     _isSelected = value; 
     RaisePropertyChanged(); 
    } 
} 

На модели представления страницы добавить SelectedItem свойство, которое установит IsSelected всем пунктам правильно:

public Item SelectedItem 
{ 
    get { return _selectedItem; } 
    set 
    { 
     if (_selectedItem != value) 
     { 
      if (_selectedItem != null) 
      { 
       _selectedItem.IsSelected = false; 
      } 
      if (value != null) 
      { 
       value.IsSelected = true; 
      } 
      _selectedItem = value; 
      RaisePropertyChanged(); 
     } 
    } 
} 

Теперь необходимо связать эти два свойства:

<ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Name}" /> 
       <Button Content="Click Me" Visibility="{Binding IsSelected, Converter={StaticResource VisibilityConverter}}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Вам также нужен конвертер для преобразования значения bool в Visibility:

public class VisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     if (value is bool) 
     { 
      return (bool) value ? Visibility.Visible : Visibility.Collapsed; 
     } 
     else 
     { 
      return Visibility.Collapsed; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     throw new System.NotImplementedException(); 
    } 
} 

Объявить его как статический ресурс на странице:

<Page.Resources> 
    <local:VisibilityConverter x:Key="VisibilityConverter" /> 
</Page.Resources> 

Без шаблона MVVM Вам лучше всего с помощью Cimbalino multibinding behavior. Первая ссылка Cimbalino Toolkit.Затем вы можете настроить MultiBinding в XAML:

<ListBox ItemsSource="{Binding Items}" x:Name="MyListBox"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Name}" /> 
       <Button Content="Click Me"> 
        <interactivity:Interaction.Behaviors> 
         <behaviors:MultiBindingBehavior PropertyName="Visibility" Converter="{StaticResource VisibilityMultiConverter}"> 
          <behaviors:MultiBindingItem Value="{Binding}"/> 
          <behaviors:MultiBindingItem Value="{Binding SelectedItem, ElementName=MyListBox}"/> 
         </behaviors:MultiBindingBehavior> 
        </interactivity:Interaction.Behaviors> 
       </Button> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 

Опять вам нужен конвертер, который проверяет, является ли элемент выбран в данный момент:

public class VisibilityMultiConverter : MultiValueConverterBase 
{ 
    public override object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     return values[0] != null && values[0] == values[1] ? Visibility.Visible : Visibility.Collapsed; 
    } 

    public override object[] ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new System.NotImplementedException(); 
    } 
} 

И добавить конвертер в качестве страницы ресурса:

<Page.Resources> 
    <local:VisibilityMultiConverter x:Key="VisibilityMultiConverter" /> 
</Page.Resources> 
+0

Привет, Дамир, Большое спасибо за ваш ответ. Я думал о том, чтобы делать что-то похожее на ваше предложение, но во всех документах/советах, которые я видел относительно приложений uwp, все они говорят, что используют VisualStateManager, но довольно расплывчаты в том, как именно его использовать. Как я уже говорил, я попробовал пару способов, но я не мог заставить его работать. – RobDev

+0

Интересно. Можете ли вы поделиться ссылкой на одну из этих рекомендаций VisualStateManager? –

+0

Привет, Дамир, вот несколько ссылок, которые я не мог получить, я знаю, что один из них - Silverlight, а другой - для Windows 8 Phone, но я думал, что они могут работать с Windows 10 UWP: https: // stackoverflow.com/questions/29249313/wp8-change-the-listboxitem-datatemplate-on-selection-changed/29249800 https://social.msdn.microsoft.com/Forums/silverlight/en-US/85082268-b7cb -4196-b3c6-d6fff6023a01/visualstatemanager-doesnt-work-when-defined-in-listboxitem-template? Forum = silverlightnet – RobDev

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