Изменение VisualState элемента управления путем связывания его с некоторым свойством ViewModel - PullRequest
2 голосов
/ 29 октября 2010

С учетом кода ниже:

 xmlns:interactivity="clr-namespace:Microsoft.Expression.Interactivity;assembly=Microsoft.Expression.Interactivity"

...

 <ToggleButton IsChecked="{Binding Path=IsGlobalControllerAttached}" Command="{Binding Path=AttachDetachGlobalControllerAction}" ToolTip="{Binding Path=GlobalControllerToolTip}" Visibility="{Binding Path=CanApplyDateFilter, Converter={StaticResource bool2VisibilityConverter}}" Style="{StaticResource toolBarToggleButton}">
                <i:Interaction.Behaviors>
                    <ei:DataStateBehavior Binding="{Binding IsGlobalControllerCreated}" Value="true" TrueState="Normal" FalseState="Disabled" />
                </i:Interaction.Behaviors>
                <Image Source="../../Common/Images/pin.png"/>
            </ToggleButton>

Я пытаюсь установить VisualState кнопки Toggle, привязав его к какому-либо свойству во ViewModel. Здесь я не могу найти файл Microsoft.Expression.Interactivity.dll в списке «Добавить ссылку». Я использую VS 2010. Что мне не хватает? Нужно ли устанавливать смесь Expression, чтобы получить эту DLL?

Кроме того, Есть ли другой способ сделать работу? (Изменение VisualState элемента управления путем связывания его с некоторым свойством ViewModel).

Спасибо за ваш интерес.

1 Ответ

2 голосов
/ 12 ноября 2010

Мы используем Attached Properties для управления пользовательскими изменениями состояния элементов.Затем они просто привязываются к модели представления.

Например, для настройки «разделенного экрана» мы делаем следующее.

Создаем свойство DependancyProperty в классе с именем SplitScreen со свойствомназываемый режим:

    public class SplitScreen
    {
        public static readonly DependencyProperty ModeProperty =
            DependencyProperty.Register("Mode",
                                        typeof(SplitScreenMode),
                                        typeof(UserControl),
                                        new PropertyMetadata(SplitScreenMode.None,
                                            new PropertyChangedCallback(OnScreenModeChanged)));

        public static void SetMode(DependencyObject obj, SplitScreenMode value)
        {
            obj.SetValue(ModeProperty, value);
        }

        public static SplitScreenMode GetMode(Control obj)
        {
            return (SplitScreenMode)obj.GetValue(ModeProperty);
        }

        static void OnScreenModeChanged(object sender, DependencyPropertyChangedEventArgs args)
        {
            var control = sender as UserControl;
            if (control != null)
            {
                if (control.Parent == null)
                {
                    control.Loaded += (s, e) =>
                                          {
                                              ApplyCurrentState(control);
                                          };
                }
                else
                {
                    ApplyCurrentState(control);
                }
            }
        }
        [snip]
    }

Вы могли бы заметить наш маленький трюк с позднее обновление значение, когда изначально установлено Attached Property (часто родительский элемент отсутствует, пока страница не будетполностью загружен).

В файле Xaml присоедините свойство к необходимому элементу следующим образом:

lib:SplitScreen.Mode="{Binding SplitScreenMode}"

Ключ заключается в том, чтобы отследить изменения свойства зависимости и получитьчтобы изменить визуальное состояние прикрепленного элемента (это фрагмент файла SplitScreen.cs):

static public void ApplyCurrentState(Control control)
{
    string targetState;
    switch (GetMode(control))
    {
        case SplitScreenMode.Single:
            targetState = SplitScreenModeName.Single;
            break;
        case SplitScreenMode.Dual:
            targetState = SplitScreenModeName.Dual;
            break;
        default:
            targetState = SplitScreenModeName.None;
            break;
    }
    VisualStateManager.GoToState(control, targetState, true);
}

Альтернативой является установка Expression Blend SDK Вы не делаетенужен Expression Blend, чтобы использовать SDK и все классные дополнения.Это намного меньше работы для простых предметов (нам просто нужно было некоторое нестандартное поведение, которое он не поддерживал).

...