Как связать конфигурацию решения из XAML? - PullRequest
1 голос
/ 07 февраля 2012

Когда я создаю свое приложение, используя конфигурацию выпуска, я хочу установить свойство на true, но в противном случае я хочу установить его на false. Я имею в виду следующее:

<Window Topmost="{Binding IsReleaseBuild}">

Обычно я бы просто использовал директивы препроцессора #if и #endif для проверки константы DEBUG, но это невозможно в XAML.

Как лучше всего справиться с этим?

Скорее всего Я могу создать значение, которое я могу связать в моем контексте данных. Однако я бы предпочел создать многоразовое решение.

Я также мог бы просто использовать директивы препроцессора в коде файла, но мне было интересно, есть ли более чистое решение.

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Как насчет прикрепленной собственности?

public sealed class Solution
{
    public static readonly DependencyProperty IsReleaseBuildProperty =
        DependencyProperty.RegisterAttached(
        "IsReleaseBuild",
        typeof(bool),
        typeof(Solution),
        new FrameworkPropertyMetadata(
#if DEBUG
            false
#else
            true
#endif
           ));

    public static bool GetIsReleaseBuild(DependencyObject source)
    {
        return (bool)source.GetValue(IsReleaseBuildProperty);
    }
}

А в вашем XAML:

<Window Topmost="{Binding RelativeSource={RelativeSource Self} Path=util:Solution.IsReleaseBuild}" />
1 голос
/ 07 февраля 2012

Вы можете просто сделать что-то вроде этого;основанный на решении в ссылке, которую вы разместили.

public bool IsReleaseBuild
{
    get { return MyStaticClass.IsAssemblyDebugBuild(Assembly.GetExecutingAssembly()); }
}

Если вы используете MVVM, вы можете просто вставить Property в ваш BaseClass и разрешить его использование всеми View/ViewModels.

Это может выглядеть примерно так.

public class BaseViewModel : ObservableObject
{
    public Boolean IsReleaseBuild
    {
        get
        {
           ...
        }
    }
}

Я делаю что-то похожее, чтобы выяснить, находится ли мое приложение в Visual Studio Design Mode:

public class BaseViewModel : ObservableObject
{
    private static Nullable<Boolean> _isInDesignMode;

    public Boolean IsInDesignMode
    {
        get
        {
            if (!_isInDesignMode.HasValue)
            {
                DependencyProperty property = DesignerProperties.IsInDesignModeProperty;

                _isInDesignMode
                    = (bool)DependencyPropertyDescriptor
                                    .FromProperty(property, typeof(FrameworkElement))
                                    .Metadata.DefaultValue;
            }

            return _isInDesignMode.Value;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...