Как установить значение для отображения связанных свойств в режиме разработки WPF? - PullRequest
6 голосов
/ 30 ноября 2010

Мое связанное содержимое отображается в виде строки empty в режиме разработки пользовательского интерфейса.Я хочу отобразить некоторое поддельное значение для этого содержимого, но я не знаю, как это сделать.

Пожалуйста, поделитесь, если знаете, как.Спасибо!

Ответы [ 4 ]

9 голосов
/ 30 ноября 2010

Простой способ получения данных времени разработки в Visual Studio 2010 - использовать текст-дизайн-данных.Короткий пример с Window и ViewModel. Для DataContext d: DataContext будет использоваться в режиме разработки, а StaticResource будет использоваться во время выполнения.Вы также можете использовать отдельную ViewModel для дизайна, но в этом примере я буду использовать одну и ту же ViewModel для обоих.

<Window ...
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:local="clr-namespace:DesignTimeData"
        mc:Ignorable="d"            
        d:DataContext="{d:DesignInstance local:MyViewModel,
                        IsDesignTimeCreatable=True}">
    <Window.Resources>
        <local:MyViewModel x:Key="MyViewModel" />
    </Window.Resources>
    <Window.DataContext>
        <StaticResource ResourceKey="MyViewModel"/>
    </Window.DataContext>
    <StackPanel>
        <TextBox Text="{Binding MyText}"
                 Width="75"
                 Height="25"
                 Margin="6"/>
    </StackPanel>
</Window>

И в свойстве ViewModels MyText мы проверяем, находимся ли мы в режиме конструктора, и в этом случаемы возвращаем что-то еще.

public class MyViewModel : INotifyPropertyChanged
{
    public MyViewModel()
    {
        MyText = "Runtime-Text";
    }

    private string m_myText;
    public string MyText
    {
        get
        {
            // Or you can use
            // DesignerProperties.GetIsInDesignMode(this)
            if (Designer.IsDesignMode)
            {
                return "Design-Text";
            }
            return m_myText;
        }
        set
        {
            m_myText = value;
            OnPropertyChanged("MyText");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Designer.cs, который находится здесь , выглядит следующим образом

public static class Designer
{
    private static readonly bool isDesignMode;
    public static bool IsDesignMode
    {
        get { return isDesignMode; }
    }
    static Designer()
    {
        DependencyProperty prop =
            DesignerProperties.IsInDesignModeProperty;
        isDesignMode =
            (bool)DependencyPropertyDescriptor.
                FromProperty(prop, typeof(FrameworkElement))
                      .Metadata.DefaultValue;
    }
}
5 голосов
/ 18 февраля 2014

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

2 голосов
/ 30 ноября 2010

Вы можете использовать свойство DesignMode, чтобы узнать, находитесь ли вы во время разработки (http://msdn.microsoft.com/en-us/library/c58hb4bw(vs.71).aspx)

Есть дальнейшие мысли, но нет реальных выводов о способах сделать это в этом вопросе: Какие подходы доступны для фиктивных данных времени разработки в WPF?

0 голосов
/ 30 ноября 2010

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

private string _content;
public string Content
{
    get
    { 
        if (_content != "") return _content;
        else return "FAKE";
    }
    set { _content= value; }
}
...