以编程方式将WPF样式设置为基线样式

时间:2016-09-08 15:35:16

标签: c# wpf mvvm

我有一个WPF项目,我在ViewModel中以编程方式动态设置某些元素的样式。

我定义了我的Style属性,如下所示:

private static Style okTextStyle = Application.Current.FindResource("SimpleTextBox") as Style;
private static Style errorTextStyle = Application.Current.FindResource("SimpleTextBoxError") as Style;

private Style keyTypeValueMeaningStyle = okTextStyle;
public Style KeyTypeValueMeaningStyle
{
    get { return keyTypeValueMeaningStyle; }
    set
    {
        keyTypeValueMeaningStyle = value;
        OnPropertyChanged(new PropertyChangedEventArgs("KeyTypeValueMeaningStyle"));
    }
}

// ...later in the code...

if (error)
{
    ...
    KeyTypeValueMeaningStyle = errorTextStyle;
}
else
{
    ...
    KeyTypeValueMeaningStyle = okTextStyle;
}

在我的XAML中使用它就像这样:

Style="{Binding KeyTypeValueMeaningStyle, UpdateSourceTrigger=PropertyChanged}"

这一切都很好;但是,我试图简化一点,而不是将okTextStyle设置为我的ResourceDictionary中的命名样式,我只是希望它设置为我的ResourceDictionary中定义的基本TextBox样式,但我不知道这是否可能。

我已尝试将此设置为null或空白,但不起作用。

private static Style okTextStyle = null As Style;

我也试过在我的else区块中做类似的事情,但它也不起作用。我猜测,因为在我的XAML中我总是定义一个样式,它需要一个有效的样式引用,而不仅仅是null或空值。

不可否认,这是第一世界编程问题,因为一切正常。但SimpleTextBox定义只是此时基线样式的重复,我试图在可能的情况下简化一点,而不是重复样式。可以这样做吗?

1 个答案:

答案 0 :(得分:0)

Application.Current.FindResource(typeof(TextBox));

如果你想要更加坦率,请看FrameworkElement.DefaultStyleKey

那就是说,这不是视图模型应该负责的事情。

顺便说一下,null As Style返回与null完全相同的null而没有投射。如果我在C#团队中,我会让编译器在该行上给你一个Otiose Cast警告。这不是我永远不会加入C#团队的唯一原因,但这是一个很好的起点。