WPF Noob Ищу руководство - PullRequest
       10

WPF Noob Ищу руководство

1 голос
/ 12 апреля 2011

Итак, большую часть времени я живу в ASP.NET MVC Land - однако сейчас я пытаюсь создать некоторые инструменты анализа для нашего решения с использованием WPF (иначе он будет считать строки кода, какие файлы тестируются). извлечение метаданных из атрибутов и т. д.). Все в основном идет хорошо (код отражения у меня отлично работает). У меня проблемы с WPF ItemsControl. По сравнению с традицией <asp:Repeater /> ItemsControl меня просто поражает.

Мой XAML:

<ItemsControl x:Name="repeaterRecentProjects">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border Background="#094563" Margin="5" Padding="3">
                <DockPanel>
                    <Image Source="/Content/Black-Internal-icon.png" Height="16" Width="16"></Image>
                    <TextBlock Margin="5,0" Text="{Binding}"></TextBlock>
                </DockPanel>
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsPanelTemplate>
        <StackPanel Orientation="Vertical"></StackPanel>
    </ItemsPanelTemplate>
</ItemsControl>

Идея состоит в том, что DataTemplate содержит мой шаблон, насколько я понимаю. Затем в коде я могу сделать что-то вроде этого (РЕДАКТИРОВАТЬ: полный код позади страницы):

public partial class HomeScreen : Page
{
    protected bool _isProjectChosen = false;

    public HomeScreen()
    {
        InitializeComponent();
    }

    protected ObservableCollection<string> someFiles = new ObservableCollection<string>();

    protected override void OnInitialized(EventArgs e)
    {
        base.OnInitialized(e);

        someFiles.Add("SomeFile.aspx");
        someFiles.Add("SomeFile2.aspx");
        someFiles.Add("SomeFile3.aspx");

        repeaterRecentProjects.ItemsSource = someFiles;
    }

    private void buttonSelectProject_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog dialogSelectProject = new OpenFileDialog();

        dialogSelectProject.DefaultExt = ".sln";
        dialogSelectProject.Filter = "Visual Studio Solution (.sln)|*.sln";

        if (dialogSelectProject.ShowDialog() == true)
        {
            textBlockProjectName.Text = dialogSelectProject.FileName;
            _isProjectChosen = true;
            buttonAnalyzeProject.IsEnabled = true;
        }

        someFiles.Add("AnotherString.aspx");
    }

    private void buttonAnalyzeProject_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Click");
    }
}

Однако, когда я запускаю свое приложение, Я не вижу три элемента в моем элементе управления, только один элемент . Почему это? Кроме того, правильное ли будет мое обязательное выражение? Так как я не привязываюсь к свойству строки, просто {Binding} должно быть приемлемым, верно?

Ответы [ 3 ]

3 голосов
/ 12 апреля 2011
<ItemsPanelTemplate>
    <StackPanel Orientation="Vertical"></StackPanel>
</ItemsPanelTemplate>

Добавляется в ItemsControl как элемент вместо установки его в качестве ItemsPanel, это будет правильный путь:

    <ItemsControl>
        ...
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Vertical"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>

( В любом случае это избыточно, поскольку панель по умолчанию уже является вертикальной StackPanel )

0 голосов
/ 12 апреля 2011

Я выяснил проблему, но мог бы использовать некоторые рекомендации о том, почему это происходит. Когда я удалил следующие узлы из XAML, он работает правильно:

<ItemsPanelTemplate>
    <StackPanel Orientation="Vertical"></StackPanel>
</ItemsPanelTemplate>

Почему он считал этот шаблон среди коллекции предметов? Насколько я понимаю, это был просто элемент контейнера, к которому он решил добавить каждый шаблон данных.

0 голосов
/ 12 апреля 2011

Попробуйте настроить ItemsSource на вашем элементе управления

repeaterRecentProjects.ItemsSource = someFiles;
...snipped...
...