2010-06-10 34 views
0

如果SelectedDate为null,我有一个DatePicker,我想将BorderBrush设置为SolidColorBrush(Colors.Red)。如果一个日期已经填入,我想只有默认的BorderBrush。我仍然希望能够在Blend中设置默认的BorderBrush,所以我不想硬编码DatePicker的默认边框刷。所以基本上:Silverlight 3与ValueConverter的DataBinding:有条件地使用属性的默认值

XAML:

<controls:DatePicker BorderBrush="{Binding SelectedDate, RelativeSource={RelativeSource Self}, Converter={StaticResource BrushConverter}, Mode=OneWay}"/> 

C#:

public class BrushConverter : IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
      return value == null ? 
       new SolidColorBrush(Colors.Red) : /* when value != null have the bound property use it's default value */ 
     } 

这可能吗?

+0

的Silverlight版本?这种机制已经存在用于指示验证错误。 – AnthonyWJones 2010-06-10 12:11:42

回答

0

这里是你如何去解决这个问题:

1)保存的DatePicker的BorderBrush在应用程序启动

2)绑定的DatePicker的BorderBrush在视图模型一个公共属性(或任何类型分配给页面的DataContext)

3)实现DatePicker的SelectedDateChanged事件,根据DatePicker的SelectedDate是否为null,将默认(保存的)画笔或红色画笔分配给公共属性。

在SomePage.xaml:

 <sdk:DatePicker Name="DatePicker" 
        BorderBrush="{Binding DatePickerBorderBrush, Mode=OneWay}" 
        SelectedDateChanged="SelectedDateChanged" 
        Width="120" 
        Height="22"/> 

在SomePage.xaml.cs:

public partial class SomePage : UserControl, INotifyPropertyChanged 
{ 
    Brush defaultDatePickerBrush; 

    public Brush DatePickerBorderBrush 
    { 
     get 
     { 
      return (_DatePickerBorderBrush); 
     } 
     set 
     { 
      _DatePickerBorderBrush = value; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("DatePickerBorderBrush")); 
      } 
     } 
    } 
    Brush _DatePickerBorderBrush; 

    public MainPage() 
    { 
     InitializeComponent(); 
     defaultDatePickerBrush = DatePicker.BorderBrush; 
     DatePickerBorderBrush = new SolidColorBrush(Colors.Red); 
     DataContext = this; 
    } 

    private void SelectedDateChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (DatePicker.SelectedDate == null) 
      DatePickerBorderBrush = new SolidColorBrush(Colors.Red); 
     else 
      DatePickerBorderBrush = defaultDatePickerBrush; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
}