Как использовать свойство типа делегата в Xaml? - PullRequest
2 голосов
/ 09 июня 2011

У меня есть тип делегата:

public delegate bool CheckFormatDelegate(int row, int col, ref string text);

Это было использовано в свойстве объекта Xaml:

public virtual CheckFormatDelegate CheckFormat { get; set; }

Я установил значение свойства для одного из группы делегатов, например:

public class FCS
{
    public static bool FormatDigitsOnly(int row, int col, ref string text)
    {
        ...
    }
}

Если я установлю свойство в codebehind, все будет хорошо. Однако, если я установлю его в Xaml:

<mui:DXCell CheckFormat="mui:FCS.FormatDigitsOnly"/>

когда я запускаю свое приложение, я получаю исключение: «Тип« CheckFormatDelegate »не имеет общедоступного класса TypeConverter». Кто-нибудь знает, есть ли встроенный набор конвертеров / расширений разметки, подобных тем, которые используются для RoutedEvent? Или есть другой способ обойти это?

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

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

Используйте расширение разметки x:Static.

<object property="{x:Static prefix:typeName.staticMemberName}" ... />

См. Документы MSDN:

http://msdn.microsoft.com/en-us/library/ms742135.aspx

Согласно этой странице:

... большинство полезных статических свойств имеют такую ​​поддержку, как преобразователи типов, которыеоблегчить использование, не требуя {x: Static} ...

Я полагаю, ваш пользовательский делегат этого не делает, и потребует от вас использования x:Static.

Edit

Я опробовал его, и, похоже, он не работает с методами, как вы упоминали.Но это работает против свойств.Вот обходной путь:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <local:Class1 CheckFormat="{x:Static local:FCS.FormatDigitsOnly}" />
</Window>

namespace WpfApplication1
{
    public delegate bool CheckFormatDelegate(int row, int col, ref string text);

    public class Class1
    {
        public virtual CheckFormatDelegate CheckFormat { get; set; }
    }

    public class FCS
    {
        private static bool FormatDigitsOnlyImpl(int row, int col, ref string text)
        {
            return true;
        }

        public static CheckFormatDelegate FormatDigitsOnly
        {
            get { return FormatDigitsOnlyImpl; }
        }
    }
}

Редактировать 2

Я не хочу красть их ответы (поэтому, пожалуйста, проголосуйте вместо этого, если только выя предпочитаю обходные пути к свойствам), но здесь есть вопрос, у которого есть еще лучшее решение для вас:

Привязка статического метода / функции к свойству Func в XAML

1 голос
/ 09 июня 2011

Самый простой вариант - использовать интерфейс, а не делегат

public interface IFormatChecker
{
    bool CheckFormat(int row, int col, ref string text);
}

public sealed class CheckFormatByDelegate : IFormatChecker
{
    ...
}

public class FCS
{
    public static readonly IFormatChecker FormatDigitsOnly = new CheckFormatByDelegate();
}

<mui:DXCell CheckFormat="{x:Static mui:FCS.FormatDigitsOnly}"/>

Полагаю, вы могли бы создать свой собственный MarkupExtension, если вам не понравился интерфейс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...