【问题标题】:Setting Binding Properties in a Template在模板中设置绑定属性
【发布时间】:2010-08-08 08:34:55
【问题描述】:

有没有办法在样式中对 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>

.. 我不知道如何将 Converter 和 Validation 规则合并到我的 TimeOfDayTextBox 样式中。

非常感谢。

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    很遗憾,没有。该样式只能将 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。看看这个问题:What is currently the best, free time picker for WPF?

    【讨论】:

    • 感谢 Quartermeister。时间选择器正是我所需要的。另外,感谢标记扩展选项。这是我今天学到的其他东西。干杯。
    【解决方案2】:

    样式只能包含一组可应用于多个控件的通用属性。在您的情况下,转换器和验证规则不会应用于文本框,而是应用于绑定的内容,因此它们特定于单个元素并且不能在样式中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 2011-10-15
      • 2016-02-24
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多