Свойство Func в пользовательском элементе управления - PullRequest
2 голосов
/ 13 июля 2010

У меня есть пользовательский элемент управления, в который я хотел бы добавить свойство зависимости типа Func, чтобы я мог назначить ему обработчик метода в XAML. Однако это вызовет исключение XAMLParseException: тип 'Func`2' не имеет открытого класса TypeConverter. Что я делаю неправильно? Мне нужно реализовать TypeConverter для Func или есть лучший способ?

Свойство зависимости Func в пользовательском элементе управления (MyUserControl):

public Func<int, int> MyFunc
{
    get { return (Func<int, int>)GetValue(MyFuncProperty); }
    set { SetValue(MyFuncProperty, value); }
}

public static readonly DependencyProperty MyFuncProperty =
    DependencyProperty.Register("MyFunc", 
                                typeof(Func<int, int>), 
                                typeof(SillyCtrl), 
                                new UIPropertyMetadata(null));

Пример использования DP, XAML:

<Window x:Class="FuncTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:FuncTest="clr-namespace:FuncTest"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <FuncTest:MyUserControl MyFunc="SquareHandler" />
    </Grid>
</Window>

Код позади:

namespace FuncTest
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            SquareHandler = (arg => arg * arg);

            DataContext = this;
        }

        public Func<int, int> SquareHandler { get; set; }
    }
}

1 Ответ

5 голосов
/ 13 июля 2010
MyFunc="SquareHandler"

означает, что для свойства "MyFunc" задано значение "SquareHandler" string , и поэтому он запрашивает у TypeConverter возможность преобразования строк в Funcs, изменив его на

<FuncTest:MyUserControl MyFunc="{Binding SquareHandler}" />

для использования свойства SquareHandler текущего DataContext.

...