Как реализовать IsEnabledChanged формы данных silverlight с использованием MVVM - PullRequest
0 голосов
/ 20 января 2012

Я ищу пример того, как реализовать свойство IsEnabledChanged формы данных с использованием света MVVM, я настроил триггеры, но не уверен насчет реализации. Итак, вот код версии:

  void DataForm_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        if (!IsEnabled)
        {
            VisualStateManager.GoToState(DataForm, "Disabled", true);
        }
        else
        {
            VisualStateManager.GoToState(DataForm, "Normal", true);
        }
    }

DataForm.IsEnabledChanged += new DependencyPropertyChangedEventHandler(DataForm_IsEnabledChanged);

в xaml с использованием MVVM light Я сделал это:

 <i:EventTrigger EventName="IsEnabledChanged">
                    <cmdextras:EventToCommand Command="{Binding IsEnabledChangedCommand}" CommandParameter="{Binding .}" />
                </i:EventTrigger>

Теперь нужно выяснить, как перевести код, чтобы использовать команду relay.

Ответы [ 2 ]

1 голос
/ 20 января 2012

Я создал поведение, аналогичное событию EditStarted формы данных.

public class EditableDataFormBehavior : Behavior<RadDataForm>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.Loaded += AssociatedObject_Loaded;
    }

    void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
    {
        AssociatedObject.CurrentItemChanged += AssociatedObject_CurrentItemChanged;
    }

    void AssociatedObject_CurrentItemChanged(object sender, EventArgs e)
    {
        var editableObject = AssociatedObject.CurrentItem as INotifyEditableObject;
        if (editableObject != null)
        {
            editableObject.EditStarted += Object_EditStarted;
        }
    }

    void Object_EditStarted(object sender, EventArgs e)
    {
        AssociatedObject.BeginEdit();
    }

    protected override void OnDetaching()
    {
        // detach the event handler
        AssociatedObject.Loaded -= AssociatedObject_Loaded;
        AssociatedObject.CurrentItemChanged -= AssociatedObject_CurrentItemChanged;

        var editableObject = AssociatedObject.DataContext as INotifyEditableObject;
        if(editableObject!=null)
            editableObject.EditStarted -= Object_EditStarted;
        base.OnDetaching();
    }


}

Вам просто нужно немного изменить, добавив вместо этого событие IsEnabledChanged. Вы пытаетесь добиться только поведения представления, и модель представления ничего не должна знать об этом. Основным преимуществом такого подхода является то, что он более пригоден для повторного использования, чем код.

В обработчике событий вы добавите свой код:

    if (!IsEnabled)
    {
        VisualStateManager.GoToState(DataForm, "Disabled", true);
    }
    else
    {
        VisualStateManager.GoToState(DataForm, "Normal", true);
    }

Прикрепить поведение к форме данных (моя была создана для телерика, но должна быть выполнена с помощью sdk)

 <i:Interaction.Behaviors>
                <utilities:EditableDataFormBehavior/>
 </i:Interaction.Behaviors>
1 голос
/ 20 января 2012

EventTrigger имеет дело только с перенаправленными событиями ( см. Документацию ).Поскольку вы имеете дело с измененным свойством свойства зависимостей , EventTrigger просто не распознает его.

Итак, из того, что я вижу, использование кода позади - единственный способ достичь требуемой функциональности,Также вы имеете дело с функциональностью, которая принадлежит представлению и связана с элементом управления, который вы используете (в данном случае DataForm).Следовательно, было бы нецелесообразно включать эту зависимость в модель представления, поскольку модель представления должна быть независимой от любой конкретной реализации представления, т. Е. Цель состоит в том, чтобы спроектировать модель представления так, чтобы ее можно было использовать независимо отвид и элементы управления, используемые в нем.

...