我有以下情况:
<UserControl.Resources>
<Style x:Key="NormalFontStyle">
<Setter Property="Control.FontFamily" Value="{Binding MyFont}"></Setter>
</Style>
<Style x:Key="BigFontStyle">
<Setter Property="Control.FontFamily" Value="{Binding MyFont}"></Setter>
<Setter Property="Control.FontSize" Value="{Binding MyBigFontSize}"></Setter>
</Style>
</UserControl.Resources>
<Grid Style="{StaticResource NormalFontStyle}">
<!-- Grid Contents -->
</Grid>
Grid的DataContext是包含MyFont和MyBigFontSize属性的ViewModel。上面的代码工作正常,网格中的每个文本都应用了“NormalFontStyle”。
现在棘手的部分:我想将“BigFontStyle”应用于网格内的控件,该控件可能有也可能没有相同的DataContext,这意味着我无法使用这种方法。 也许将setter的值绑定到静态属性是唯一的方法,(我刚刚找到了this 3.5的解决方法,这是我的情况)但是欢迎任何关于此的亮点。
答案 0 :(得分:2)
您应该将属性放入单例中,这样您就可以从应用程序的任何位置绑定和编辑它们。
MySingleton.cs(ViewModelBase包含INotifyPropertyChanged的实现)
public class MySingleton: ViewModelBase
{
private static MySingleton instance;
private static readonly object padlock = new object();
private FontFamily _myFont = new FontFamily();
public static MySingleton Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new MySingleton();
}
}
return instance;
}
}
public FontFamily MyFont
{
get { return _myFont ; }
set
{
_myFont = value;
OnPropertyChanged("MyFont");
}
}
}
的App.xaml
<Application ...
xmlns:local="clr-namespace:ScrumManagementClient.ViewModel">
<Application.Resources>
<ResourceDictionary>
<local:CurrentDataSingleton x:Key="Singleton"/>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MyResourceDictionary.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
MyResourceDictionary.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="NormalFontStyle">
<Setter Property="Control.FontFamily" Value="{Binding Source={StaticResource Singleton}, Path=Instance.MyFont}"/>
</Style>
<Style x:Key="BigFontStyle">
<Setter Property="Control.FontFamily" Value="{Binding MyFont}"/>
<Setter Property="Control.FontSize" Value="{Binding MyBigFontSize}"/>
</Style>
<ResourceDictionary/>
现在,您可以从应用程序的任何位置使用您的stlyes:
`Style="{StaticResource stylename}"`
并在c#中设置一个值:
MySingleton.Instance.Property = ?