WPF Noob寻求指导

时间:2011-04-12 14:41:07

标签: c# wpf xaml data-binding itemscontrol

所以,我大部分时间都住在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 个答案:

答案 0 :(得分:3)

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

作为项目添加到ItemsControl而不是将其设置为ItemsPanel,这将是正确的方法:

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

无论如何这都是多余的,因为默认面板已经是垂直的StackPanel

答案 1 :(得分:0)

尝试在商品控件上设置ItemsSource

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

答案 2 :(得分:0)

我已经找到了问题,但可以使用一些指导原因。当我从XAML中删除以下节点时,它可以正常工作:

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

为什么在项目集合中计算该模板?我的理解是,这只是它选择添加每个数据模板的容器项。