WPF新手寻求指导
本文关键字:新手 WPF | 更新日期: 2023-09-27 17:49:43
所以,大部分时间我都生活在ASP中。NET MVC Land -然而,现在我正在尝试使用WPF为我们的解决方案制作一些分析工具(也就是,它会计算代码行数,哪些文件有测试,从属性中提取元数据等)。一切都很顺利(我的反射代码工作得很好)。我遇到的问题是WPF ItemsControl。与传统的<asp:Repeater />
相比,ItemsControl完全让我感到困惑。
:
<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");
}
}
然而,每当我运行我的应用程序时,我在items控件中看不到三个项目,只有一个项目。为什么会这样?另外,我的绑定表达式是否正确?因为我没有绑定字符串的属性,简单的{Binding}
应该是可以接受的,对吧?
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"></StackPanel>
</ItemsPanelTemplate>
被添加到ItemsControl作为一个项目,而不是将其设置为ItemsPanel
,这将是正确的方式:
<ItemsControl>
...
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
(这是多余的,因为默认面板已经是垂直的StackPanel)
尝试在items控件上设置ItemsSource
repeaterRecentProjects.ItemsSource = someFiles;
...snipped...
我已经找到了问题所在,但是可以使用一些指导来解释为什么会发生这种情况。当我从XAML中删除以下节点时,它可以正常工作:
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"></StackPanel>
</ItemsPanelTemplate>
为什么在item集合中计算该模板?我的理解是,这只是它选择添加每个数据模板的容器项。