Каким образом MVVM способ установить видимость визуальных элементов одинакового уровня в .NET MAUI 9?C#

Место общения программистов C#
Ответить
Anonymous
 Каким образом MVVM способ установить видимость визуальных элементов одинакового уровня в .NET MAUI 9?

Сообщение Anonymous »

Я использую библиотеку Syncfusion в моем проекте MAUI для мобильного приложения, в частности, sfexpander [1] и sfaccordion [2] , хотя мой вопрос относится к любому элементу с другими вложенными элементами, которые имеют свойства события.
У меня есть модель, называемая CategoryTemplate , который содержит vaseleCollection CALD DropWondItems , который представляет подкатегории. Иерархия, на мой взгляд, (для простоты я ограничу количество SFExpanders 1) заключается в следующем: < /p> То, что я пытаюсь добиться, - это установление всех других основных разделов категории (т.е.: sfexpander ) Isvisible свойство в false , когда < Strong> First sfaccordion расширяющийся событие запускается. Затем сделайте обратное, когда его спускается событие. идет против принципов MVVM, потому что: < /p>

[*] Прямая манипуляция с UI в коде: < /p>

Мой Кодовые методы OnacCordionExpanding и OnacCordionCollApsing напрямую доступ и изменять свойства элементов пользовательского интерфейса (

Код: Выделить всё

SfExpander
, sfaccordion ), как Isvisible .
MVVM выступает за отделение view от viewModel (данные и логика). Код-завод должен в первую очередь обрабатывать конкретные задачи (например, настройка привязки или очень минимальные взаимодействия пользовательского интерфейса), но не должно содержать бизнес-логику или управления состоянием приложения. < /Li>
< /ul>
/li>
Просмотреть логику в коде-ввоении: < /p>

Логика для определения того Sfexpander s, чтобы скрыть или показать на основе расширения/обрушения аккордеона, внедрено в моем коде-блудении. Эта логика является поведением приложения и должна находиться в ViewModel. >

Мой код-бенд тесно связан с конкретными элементами пользовательского интерфейса (Charsexpander, Locsexpander, itemsexpander). Это затрудняет проверку поведения моего приложения в модульном тестировании. Logic ViewModel, в идеале, должна быть легко проверена без участия UI. < /Li>
< /ul>
< /li>
< /ol>

Код: Выделить всё


< /code>
private void OnAccordionCollapsing(object sender_p, Syncfusion.Maui.Accordion.ExpandingAndCollapsingEventArgs e)
{
if(sender_p is SfAccordion _accordion && _accordion is not null)
{
SfExpander? _parentExpander = null;
SfExpander[]? expandersToCheck = [charsExpander, locsExpander, itemsExpander];
foreach (SfExpander expander in expandersToCheck)
{
if (expander.GetVisualTreeDescendants().Any(x => x == _accordion))
{
_parentExpander = expander;
break; // Found the parent, no need to continue searching
}
}
if (_parentExpander != null)
{
// Find the first SfAccordion within the parent expander
SfAccordion? firstAccordion = _parentExpander.GetVisualTreeDescendants()
.OfType()
.FirstOrDefault();
// If it is the first SfAccordion and it isn't null..
if (firstAccordion is not null && firstAccordion == _accordion)
{
// Make the other SfExpanders appear again because the first accordion's content has all been collapsed.

if (_parentExpander == charsExpander)
{
locsExpander.IsVisible = true;
itemsExpander.IsVisible = true;
}
else if (_parentExpander == locsExpander)
{
charsExpander.IsVisible = true;
itemsExpander.IsVisible = true;
}
else if (_parentExpander == itemsExpander)
{
charsExpander.IsVisible = true;
locsExpander.IsVisible = true;
}
}
else
{
Debug.WriteLine("The collapsing accordion is NOT the first accordion in the parent expander.");
}
}
else
{
Debug.WriteLine("No parent expander found.");
}
}
}

private void OnAccordionExpanding(object sender_p, Syncfusion.Maui.Accordion.ExpandingAndCollapsingEventArgs e)
{
if(sender_p is SfAccordion _accordion && _accordion is not null)
{
SfExpander _parentExpander;
SfExpander[]? expandersToCheck = [charsExpander, locsExpander, itemsExpander];
foreach (SfExpander expander in expandersToCheck)
{
if (expander.GetVisualTreeDescendants().Any(x => x == _accordion))
{
// Set all other SfExpanders to disappear

if(expander == charsExpander)
{
_parentExpander = charsExpander;
locsExpander.IsVisible = false;
itemsExpander.IsVisible = false;
}
else if(expander == locsExpander)
{
_parentExpander = locsExpander;
charsExpander.IsVisible = false;
itemsExpander.IsVisible = false;
}
else if(expander == itemsExpander)
{
_parentExpander = itemsExpander;
charsExpander.IsVisible = false;
locsExpander.IsVisible = false;
}
return;
}
Debug.WriteLine("No parent expander found.");
}
}
}
< /code>
Как я могу добиться этого, придерживаясь принципов MVVM? 
s (разделы категории) будут добавлены программно, когда пользователь нажимает кнопку « добавить категорию ». В какой -то момент у XAML может не быть 3 категорий, которые у меня есть сейчас, чтобы начать, поэтому я не уверен, помогает ли это с этим решением или нет, но по сути они не являются постоянными элементами - их можно удалить или создан во время выполнения. практики), которые я должен выполнить, добавить/удалять или другие задачи, связанные с пользовательским интерфейсом, в представлении (код-завод), а не в ViewModel. Коллекция само по себе, наверное, плохая, я просто еще не решил решить это - по одной проблеме за раз.


Подробнее здесь: https://stackoverflow.com/questions/794 ... in-net-mau
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»