Member 12658724 Ответов: 2

Нажмите кнопку, чтобы развернуть/свернуть все расширители.


На мой взгляд скажем у меня есть ListView. В каждом ListItem есть эспандер. За пределами ListView есть кнопка, при нажатии на которую будут разворачиваться или сворачиваться все расширители.

Теперь я использую Prism и MVVM в моем WPF пользовательский элемент управления. То, что я сделал, было в каждом расширителе, я установил свойство bool, которое связывается с IsExpanded собственность. Затем с помощью ICommand в моем ViewModel чтобы управлять свойствами как истинными, так и ложными.

Мой вопрос в том, что это снова MVVM принцип? Должен ли я делать это в коде позади, а не внутри ViewModel потому что расширители-это элементы управления, а не связанные с данными?

Что я уже пробовал:

У меня была с кем-то ссора. Он сказал, что я должен сделать это по-другому. Может быть, он указал в коде позади, чтобы найти все расширители, такие как c# - как программно развернуть все расширители в окне - переполнение стека[^]

2 Ответов

Рейтинг:
12

Member 12658724

Я использую другой способ. Bind расширяется и IsChecked. Аналогично методу при c# - StackPanel свернута и видна при нажатии кнопки - переполнение стека[^]


Рейтинг:
0

Clifford Nelson

Я бы создал поведение. Ниже приведен пример поведения:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls.Primitives;
using System.Windows.Media;

namespace Medtronic.NIM4.UI.Common.Converters
{
    public class ResetRadioButtonOnVisibilityBehavior
    {
        public static bool GetEnable(DependencyObject obj)
        {
            return (bool)obj.GetValue(EnableProperty);
        }

        public static void SetEnable(DependencyObject obj, bool value)
        {
            obj.SetValue(EnableProperty, value);
        }

        public static readonly DependencyProperty EnableProperty =
            DependencyProperty.RegisterAttached("Enable",
                typeof(bool), typeof(ResetRadioButtonOnVisibilityBehavior),
                new UIPropertyMetadata(OnEnablePropertyChanged));

        private static void OnEnablePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var element = (FrameworkElement) d;
            if ((bool)e.NewValue)
                element.IsVisibleChanged += ElementOnIsVisibleChanged;
            else
                element.IsVisibleChanged -= ElementOnIsVisibleChanged;
         }

        private static void ElementOnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
        {
            var dependencyObject = (UIElement)sender;

            if (!(bool) dependencyPropertyChangedEventArgs.NewValue)
            {
                var checkBoxes = FindVisualChildren<ToggleButton>(dependencyObject).ToList();
                checkBoxes.ForEach(i => i.IsChecked = false);
            }
        }

        #region private static
        private static IEnumerable<T> FindVisualChildren<T>(DependencyObject root) where T : DependencyObject
        {
            if (root != null)
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(root, i);
                    if (child is T) yield return (T)child;
                    foreach (T childOfChild in FindVisualChildren<T>(child))
                        yield return childOfChild;
                }
        }
        #endregion
    }
}

Вот как бы вы использовали это поведение:
<Border converters:ResetRadioButtonOnVisibilityBehavior.Enable="True"
        Style="{StaticResource SettingsSideBorder}">


Member 12658724

Спасибо за Вашу милую помощь. Вопрос в том, что я хочу переключить кнопку, переключиться между расширением и сворачиванием. Может ли код достичь этого?

Clifford Nelson

То, что вы сделать, это принять DependencyProperty в тип bool и привязать свойство DependencyProperty значение этот флажок установлен на выключатель.