2010-08-08 86 views
0

有没有办法在样式中模板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风格。

很多谢谢。

回答

1

不幸的是,没有。样式只能将Text属性设置为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); 
    } 
} 

鉴于你控制的名字,你可能还需要使用一个时间选择器控件,而不是的文本框。看看这个问题:What is currently the best, free time picker for WPF?

+0

感谢Quartermeister。时间选择器正是我所需要的。另外,感谢您使用标记扩展选项。这是我今天学到的其他东西。干杯。 – 2010-08-09 00:39:42

1

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

+0

啊!当然!感谢您指出了毛里齐奥:) – 2010-08-09 00:43:57