Правильно привязать значение установщика стиля - PullRequest
1 голос
/ 10 ноября 2011

У меня есть следующий сценарий:

<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 Grid - это ViewModel, содержащий свойства MyFont и MyBigFontSize.Приведенный выше код работает правильно, и к каждому тексту в сетке применяется «NormalFontStyle».

Теперь сложная часть: я хочу применить BigFontStyle к элементу управления внутри сетки, который может иметь или не иметь один и тот же DataContext, что означает, что я не могу использовать этот подход.Может быть, привязка значений методов установки к статическим свойствам - единственный путь, (я только что нашел это обходной путь для 3.5, как и здесь), но любой свет на это приветствуется.

1 Ответ

2 голосов
/ 10 ноября 2011

Вы должны поместить свои свойства в синглтон, таким образом вы можете связывать и редактировать их из любого места в вашем приложении.

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 = ?
...