VS2010 показывает данные в UserControls во время разработки? - PullRequest
4 голосов
/ 20 февраля 2011

У меня есть тривиальный пользовательский элемент управления:

<UserControl x:Class="Xxx.SimpleUserControl.SimpleTextUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         x:Name="root">
    <StackPanel Background="Blue">
        <TextBlock x:Name="TitleTextBlock" Text="{Binding ElementName=root, Path=Title}" Background="White" Width="200" Height="30" Margin="5" />
        <TextBlock Text="{Binding ElementName=root, Path=Time}" Background="White" Width="200" Height="30" Margin="9" />
    </StackPanel>
</UserControl>

и код:

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace Xxx.SimpleUserControl
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class SimpleTextUserControl : UserControl
    {
    public SimpleTextUserControl()
    {
        InitializeComponent();
    }

    [Browsable(true)]
    [Category("SimpleControl")]
    public string Title
    {
        get { return (string)GetValue(TitleProperty); }
        set { SetValue(TitleProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Title.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty TitleProperty =
        DependencyProperty.Register("Title", typeof(string), typeof(SimpleTextUserControl), new FrameworkPropertyMetadata("hello"));

    [Browsable(true)]
    [Category("SimpleControl")]
    public DateTime Time
    {
        get { return (DateTime)GetValue(TimeProperty); }
        set { SetValue(TimeProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Time.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty TimeProperty =
        DependencyProperty.Register("Time", typeof(DateTime), typeof(SimpleTextUserControl), new UIPropertyMetadata(DateTime.Now));

    }
}

Я наивно ожидаю, что конструктор VS2010 для UserControl отобразит мои значения метаданных по умолчанию для моегодва элемента управления - «привет» в одном текстовом блоке, а сегодняшние дата и время - в другом, но они пусты.

Если я скомпилирую и перетащу элемент управления в приложение WPF, он будет отображаться нормально, но покав представлении / конструкторе xaml проекта UserControl.

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

Кто-нибудь знает ответ на этот вопрос?Я искал вокруг, и либо это так очевидно, что я скучаю по нему, либо это "просто так".

1 Ответ

4 голосов
/ 20 февраля 2011

Я думаю, вам нужно использовать DataContext "DesignTime".Добавьте следующее в ваш UserControl Xaml-файл

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:YourNamespace"
mc:Ignorable="d"

, а затем задайте для DesignTime DataContext значение

d:DataContext="{d:DesignInstance local:SimpleTextUserControl,
                                 IsDesignTimeCreatable=True}"

и удалите ElementName из привязок

<UserControl x:Class="YourNamespace.SimpleTextUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:YourNamespace"
             mc:Ignorable="d"
             x:Name="root"
             d:DataContext="{d:DesignInstance local:SimpleTextUserControl,
                                               IsDesignTimeCreatable=True}">
    <StackPanel Background="Blue">
        <TextBlock x:Name="TitleTextBlock" Text="{Binding Path=Title}" Background="White" Width="200" Height="30" Margin="5" />
        <TextBlock Text="{Binding Path=Time}" Background="White" Width="200" Height="30" Margin="9" />
    </StackPanel>
</UserControl>

Если у вас все еще есть проблемы с этим, я загрузил небольшой пример проекта, который вы можете сравнить с: http://www.mediafire.com/?gan28oeel4qf7ik

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