基于我对WPF的非常新的理解,我可以在我的ViewModel中设置值并将变量绑定到WPF控件,例如:
<TextBlock Text="{Binding [SomeViewModel].selfdefinedText}"/>
现在我想知道是否有可能以相同的方式应用于StaticResource?以下通常是我引用ResourceLibrary的方式:
<Button Style="{StaticResource somestyle}"/>
现在我可以绑定一个在我的viewModel中定义的变量,而不是在这里对somestyle
进行硬编码吗?
如下所示:
在我的ViewModel中:
public string TestStyle
{
get{ return _TestStyle;}
set{ SetProperty(ref _TestStyle, value);}
}
TestStyle = "someStyle";
然后在我的XAML中:
<Button Style="{StaticResource [SomeViewModel].TestStyle}"/>
答案 0 :(得分:2)
如果您的虚拟机直接暴露Style
(可能是一个坏主意),您只需:
<Button Style="{Binding SomeStyleViaViewModel}"/>
另一方面,如果您的VM正在为样式公开键,则需要转换器:
<Button Style="{Binding SomeStyleKeyViaViewModel, Converter={StaticResource MyStyleConverter}}"/>
您的转换器基本上需要根据密钥查找Style
。
答案 1 :(得分:0)
实现此目标的一种解决方法是定义AttachedProperty
(MyStyle
)并将其设置在Button
上。根据属性的值,将搜索样式并将其应用于Button
。
附属物将如下:
public static class MyStyles
{
static FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(
string.Empty, FrameworkPropertyMetadataOptions.AffectsRender, MyStylePropertyChangeCallBack);
public static readonly DependencyProperty MyStyleProperty =
DependencyProperty.RegisterAttached("MyStyle", typeof (String), typeof (MyStyles), metadata);
public static void SetStyleName(UIElement element, string value)
{
element.SetValue(MyStyleProperty, value);
}
public static Boolean GetStyleName(UIElement element)
{
return (Boolean)element.GetValue(MyStyleProperty);
}
public static void MyStylePropertyChangeCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
FrameworkElement ctrl = d as FrameworkElement;
if (ctrl.IsLoaded)
{
string styleName = Convert.ToString(e.NewValue);
if (!string.IsNullOrEmpty(styleName))
{
ctrl.Style = ctrl.TryFindResource(styleName) as Style;
}
}
}
}
然后在xaml:
<Button local:MyStyles.MyStyle="{Binding TestStyle}" />