Прикрепленное поведение Silverlight ComboBox - PullRequest
3 голосов
/ 15 марта 2010

Я пытаюсь создать прикрепленное поведение, которое можно применить к комбинированному блоку Silverlight.

Мое поведение таково:

using System.Windows.Controls;
using System.Windows;
using System.Windows.Controls.Primitives;

namespace AttachedBehaviours
{
    public class ConfirmChangeBehaviour 
    {

        public static bool GetConfirmChange(Selector cmb)
        {
            return (bool)cmb.GetValue(ConfirmChangeProperty);
        }

        public static void SetConfirmChange(Selector cmb, bool value)
        {
            cmb.SetValue(ConfirmChangeProperty, value);
        }


        public static readonly DependencyProperty ConfirmChangeProperty =
            DependencyProperty.RegisterAttached("ConfirmChange", typeof(bool), typeof(Selector), new PropertyMetadata(true, ConfirmChangeChanged));
        public static void ConfirmChangeChanged(DependencyObject d, DependencyPropertyChangedEventArgs args)
        {
            Selector instance = d as Selector;

            if (args.NewValue is bool == false)
                return;

            if ((bool)args.NewValue)
                instance.SelectionChanged += OnSelectorSelectionChanged;
            else
                instance.SelectionChanged -= OnSelectorSelectionChanged;

        }

        static void OnSelectorSelectionChanged(object sender, RoutedEventArgs e)
        {
            Selector item = e.OriginalSource as Selector;

            MessageBox.Show("Unsaved changes. Are you sure you want to change teams?");    

        }

    }

}

Это используется в XAML как это:

<UserControl x:Class="AttachedBehaviours.MainPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:this="clr-namespace:AttachedBehaviours"
             mc:Ignorable="d">
    <Grid x:Name="LayoutRoot">
        <StackPanel>
            <ComboBox ItemsSource="{Binding Teams}" 
                      this:ConfirmChangeBehaviour.ConfirmChange="true" >
            </ComboBox>
        </StackPanel>
    </Grid>
</UserControl>

Я получаю ошибку:

Неизвестный атрибут ConfirmChangeBehaviour.ConfirmChange для элемента ComboBox. [Линия: 13 Позиция: 65]

Intellisense улавливает поведение, почему происходит сбой во время выполнения?

Спасибо, Mark

РЕДАКТИРОВАТЬ: Register () изменен на RegisterAttached (). Появляется та же ошибка.

Ответы [ 2 ]

4 голосов
/ 15 марта 2010

Вы неправильно зарегистрировали прикрепленный объект

public static readonly DependencyProperty ConfirmChangeProperty =
        DependencyProperty.RegisterAttached("ConfirmChange", typeof(bool), typeof(Selector), new PropertyMetadata(true, ConfirmChangeChanged));

Должно быть

public static readonly DependencyProperty ConfirmChangeProperty =
        DependencyProperty.RegisterAttached("ConfirmChange", typeof(bool), typeof(ConfirmChangeBehaviour), new PropertyMetadata(true, ConfirmChangeChanged));

Могу я посоветовать вам перейти к использованию Blend Interacctivity Behaviors. Написание XAML вместо использования инструмента никогда не делает дизайнеров счастливыми.

1 голос
/ 15 марта 2010

Вы должны изменить это:

DependencyProperty.Register("ConfirmChange"...

к этому:

DependencyProperty.RegisterAttached("ConfirmChange"...

Присоединенные свойства (включая присоединенные поведения) должны быть зарегистрированы с использованием RegisterAttached, а не простого старого Register.

...