0

У меня есть два набора данных. Один из них является значением по умолчанию, а другой - для того, когда пользователь выбирает этот элемент. Мне нужно предоставить выбранный элемент двойной ширины и высоты обычного шаблона. Как я могу это сделать?Изменение шаблона данных, когда пользователь его выбирает

ответ

0

Что вы хотите сделать, это не сложно, но оно не решается путем замены шаблона данных. Вместо этого это достигается с помощью Visual States в XAML. Визуальное состояние позволяет вам создавать несколько «представлений» вашего XAML (например, как он выглядит, когда он выбран и когда он не выбран) и легко переключаться между ними. Обмен шаблонами данных - большое дело, Мостафа, и может привести к тому, что ваш пользовательский интерфейс мерцает, потому что базовая подсистема должна повторно отобразить так много частей визуального дерева.

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

http://blog.jerrynixon.com/2013/11/windows-81-how-to-use-visual-states-in.html

Единственная проблема сейчас, чтобы выяснить, как вызвать визуальное состояние, когда выбран элемент в GridView или ListView. Во-первых, вы должны знать, что IsSelected является свойством элемента gridviewitem или listviewitem, в котором размещается ваш элемент. Однако сложнее достичь этого свойства, и наиболее распространенным подходом является подкласс вашего gridview/listview и переопределить PrepareContainerForItemOverride и установить привязку в коде.

Как это:

class MyModel 
{ 
    public bool IsSelected { get; set; } 
} 

class MyList : Windows.UI.Xaml.Controls.ListView 
{ 
    protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
    { 
     var model = item as MyModel; 
     var listViewItem = element as Windows.UI.Xaml.Controls.ListViewItem; 

     var binding = new Windows.UI.Xaml.Data.Binding 
     { 
      Source = model, 
      Mode = Windows.UI.Xaml.Data.BindingMode.TwoWay, 
      Path = new PropertyPath(nameof(model.IsSelected)), 
     }; 
     listViewItem.SetBinding(Windows.UI.Xaml.Controls.ListViewItem.IsSelectedProperty, binding); 
     base.PrepareContainerForItemOverride(element, item); 
    } 
} 

Я надеюсь, что это помогает.

Удачи!

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