正确地绑定样式设置器值



我有以下场景:

<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>

网格的DataContext是包含MyFont和MyBigFontSize属性的ViewModel。上面的代码工作正常,网格中的每个文本都应用了"NormalFontStyle"。

现在棘手的部分:我想要应用"BigFontStyle"控件内的网格,可能有或可能没有相同的DataContext,这意味着我不能使用这种方法。也许将setter的值绑定到静态属性是唯一的方法,(我只是在3.5中找到了这个解决方案,这是我在这里的情况),但任何关于这个的光都是受欢迎的。

你应该把你的属性放到一个单例中,这样你就可以在应用程序的任何地方绑定和编辑它们。

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/>

现在你可以在你的应用程序的任何地方使用你的样式:

`Style="{StaticResource stylename}"`

在c#中设置一个值使用:

MySingleton.Instance.Property = ?

相关内容

  • 没有找到相关文章

最新更新