Установка свойств привязки в шаблоне - PullRequest
0 голосов
/ 08 августа 2010

Есть ли способ шаблона Binding.Converter и Binding.ValidationRules в стиле?

Например: у меня есть следующее текстовое поле:

            <TextBox x:Name="DepartTime" Height="23" HorizontalContentAlignment="Left" HorizontalAlignment="Left" 
                Margin="3" Width="140" 
                Style="{DynamicResource TimeOfDayTextBox}">
                <TextBox.Text>
                    <!--  Textbox notifies changes when Text is changed, and not focus. -->
                    <Binding Path="FlightDepartTime" StringFormat="{}{0:hh:mm tt}" >
                        <Binding.Converter>
                            <convert:TimeOfDayConverter />
                        </Binding.Converter>
                        <Binding.ValidationRules>
                            <!--  Validation rule set to run when binding target is updated. -->
                            <validate:ValidateTimeOfDay ValidatesOnTargetUpdated="True" />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>

.. Не могу понять, как включить конвертер и правило проверки в мой стиль TimeOfDayTextBox.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 08 августа 2010

К сожалению, нет. Стиль может установить для свойства Text только Binding. Он не может установить атрибуты привязки. Кроме того, поскольку Binding не является DependencyObject, нет способа стилизовать привязку.

Один из вариантов, который должен сделать ваш код более лаконичным, - это использовать пользовательское MarkupExtension, которое создает желаемую привязку:

public class TimeOfDayBinding
    : MarkupExtension
{
    public PropertyPath Path { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var binding = new Binding()
        {
            Path = Path,
            Converter = new TimeOfDayConverter(),
        };
        binding.ValidationRules.Add(new ValidateTimeOfDay()
        {
            ValidatesOnTargetUpdated = true,
        });
        return binding.ProvideValue(serviceProvider);
    }
}

Учитывая ваши имена элементов управления, вы также можете использовать элемент управления выбора времени вместо TextBox. Проверьте этот вопрос: Какая на данный момент самая лучшая подборка свободного времени для WPF?

1 голос
/ 08 августа 2010

Стиль может содержать только общий набор свойств, которые могут применяться к нескольким элементам управления.В вашем случае конвертер и правило проверки применяются не к текстовому полю, а к содержимому привязки, поэтому они специфичны для одного элемента и не могут использоваться в стиле.

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