Silverlight 3使用ValueConverter进行数据绑定:有条件地使用属性的默认值

Silverlight 3使用ValueConverter进行数据绑定:有条件地使用属性的默认值,silverlight,data-binding,Silverlight,Data Binding,我有一个日期选择器,如果SelectedDate为空,我想将其BorderBrush设置为SolidColorBrush(Colors.Red)。如果已经填写了日期,我只想使用默认的边界笔刷。我仍然希望能够在Blend中设置默认边界笔刷的样式,所以我不想硬编码DatePicker的默认边界笔刷。所以基本上: xaml: 这是可能的吗?以下是您解决问题的方法: 1) 在应用程序启动时保存DatePicker的边界笔刷 2) 将DatePicker的BorderBrush绑定到视图模型中的公共属性(

我有一个日期选择器,如果SelectedDate为空,我想将其BorderBrush设置为SolidColorBrush(Colors.Red)。如果已经填写了日期,我只想使用默认的边界笔刷。我仍然希望能够在Blend中设置默认边界笔刷的样式,所以我不想硬编码DatePicker的默认边界笔刷。所以基本上:

xaml:


这是可能的吗?

以下是您解决问题的方法:

1) 在应用程序启动时保存DatePicker的边界笔刷

2) 将DatePicker的BorderBrush绑定到视图模型中的公共属性(或指定给页面DataContext的任何类型)

3) 实现日期采集器的SelectedDateChanged事件,根据日期采集器的SelectedDate是否为null,将默认(已保存)笔刷或红色笔刷指定给公共属性

在SomePage.xaml中:

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

Silverlight的版本?这种机制已经存在,用于指示验证错误。
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 */
        }
        <sdk:DatePicker Name="DatePicker"
                    BorderBrush="{Binding DatePickerBorderBrush, Mode=OneWay}"
                    SelectedDateChanged="SelectedDateChanged"
                    Width="120"
                    Height="22"/>
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;
}