3

SilverlightComboBoxに適用できるアタッチされたビヘイビアーを作成しようとしています。

私の行動はこれです:

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>

エラーが発生しました:

要素ComboBoxの不明な属性ConfirmChangeBehaviour.ConfirmChange。[行:13位置:65]

Intellisenseが動作を取得していますが、実行時にこれが失敗するのはなぜですか?

ありがとう、マーク

編集: Register()がRegisterAttached()に変更されました。同じエラーが表示されます。

4

2 に答える 2

4

添付プロパティを誤って登録しました

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));

BlendInteractivityBehavioursの使用に移行することをお勧めします。ツールを使用するのではなくXAMLを作成しても、デザイナーは決して満足しません。

于 2010-03-15T13:15:40.800 に答える
1

これを変更する必要があります:

DependencyProperty.Register("ConfirmChange"...

これに:

DependencyProperty.RegisterAttached("ConfirmChange"...

アタッチされたプロパティ(アタッチされた動作を含む)は、単純な古いレジスタではなく、RegisterAttachedを使用して登録する必要があります。

于 2010-03-15T11:04:32.993 に答える