Принудительная проверка на связанных элементах управления из XAML? - PullRequest
1 голос
/ 22 августа 2009

Уже очень похожий вопрос уже опубликован. Фактически, результат ответа в этом посте - именно то, что мне нужно, но у меня нет кода, чтобы разместить этот код. Вся наша логика инкапсулирована во ViewModel. Поскольку предполагается, что ViewModel не имеет прямых ссылок на конкретные визуальные элементы, этот код там также не может существовать. Есть ли способ как-то выполнить то же самое в XAML, или я наконец-то натолкнулся на причину, заставившую создавать файлы с заданными кодами?

1 Ответ

1 голос
/ 22 августа 2009

Вы можете попробовать что-то сделать с прикрепленными свойствами. Это немного сложнее, но это так же, как и другой ответ, поэтому я думаю, что это должно работать:

public class DependencyPropertyCollection : List<DependencyProperty>
{ }

public static class ValidationUtil
{
    public static readonly DependencyProperty ForceValidationProperty =
        DependencyProperty.RegisterAttached("ForceValidation", typeof(DependencyPropertyCollection), typeof(ValidationUtil), new PropertyMetadata(OnForceValidationChanged));
    private static void OnForceValidationChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        FrameworkElement element = (FrameworkElement)sender;
        element.Loaded += OnElementLoaded;
    }

    private static void OnElementLoaded(object sender, RoutedEventArgs e)
    {
        FrameworkElement element = (FrameworkElement)sender;
        element.Loaded -= OnElementLoaded;
        foreach (DependencyProperty property in GetForceValidation(element))
            element.GetBindingExpression(property).UpdateSource();
    }

    public static DependencyPropertyCollection GetForceValidation(DependencyObject obj)
    {
        return (DependencyPropertyCollection)obj.GetValue(ForceValidationProperty);
    }
    public static void SetForceValidation(DependencyObject obj, DependencyPropertyCollection value)
    {
        obj.SetValue(ForceValidationProperty, value);
    }
}

И вы используете это так:

<TextBlock Text="{Binding Text}">
    <local:ValidationUtil.ForceValidation>
        <local:DependencyPropertyCollection>
            <x:StaticExtension Member="TextBlock.TextProperty"/>
        </local:DependencyPropertyCollection>
    </local:ValidationUtil.ForceValidation>
</TextBlock>

Внутри коллекции вы указываете каждый DependencyProperty, у которого есть привязка, которую вы хотите проверить.

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