将ItemSsource设置为User Controls的ObservableCollection的ItemsControl无法在可视树中呈现

时间:2010-09-18 22:42:52

标签: c# wpf xaml user-controls

在TestEntryView.xaml.cs中

public partial class TestEntryView : UserControl
{
    public ObservableCollection<TestFieldView> Fields {get;set;}
    ...
}

其中TestFieldView是UserControl。

<UserControl x:Class="STS2Editor.View.TestEntryView"
         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:vw="clr-namespace:STS2Editor.View"
         mc:Ignorable="d" 
         x:Name="testEntryView" 
         d:DesignHeight="300" 
         d:DesignWidth="427"
         d:DataContext="{Binding TestEntry, Source={StaticResource Sample}}">
<Grid Background="{DynamicResource ButtonNormalBorder}" TextElement.Foreground="{DynamicResource TextBrush}">
    <Border Background="{DynamicResource ControlBackgroundBrush}" BorderBrush="{DynamicResource ControlBackgroundBrush}" BorderThickness="4" CornerRadius="16">

        <Grid Margin="4" >
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <ScrollViewer Background="{DynamicResource ControlBackgroundBrush}" Grid.IsSharedSizeScope="True" Grid.Row="1">
                <ItemsControl x:Name="fieldList" ItemsSource="{Binding Fields, ElementName=testEntryView}"/>
            </ScrollViewer>
        </Grid>
    </Border>
</Grid>

绑定是正确的,但是当我窥探视觉树时,我的子项目全部由边框和内容演示者组成,没有儿童视觉效果。

3 个答案:

答案 0 :(得分:2)

如果由于某种原因我的UserControl(TestFieldView)上没有调用LoadComponent并且未正确解析Xaml,我只能重新创建您的情况。这发生在InitializeComponent中(参见例如What does InitializeComponent() do, and how does it work in WPF?)。你确定在TestFieldView的构造函数中调用它吗?

答案 1 :(得分:0)

“TestEntryView.Fields”属性是DependencyProperty吗?或者它至少会引发一个PropertyChanged事件?上面的例子不清楚它是否如此。如果它不是DP或不引发PropertyChanged事件,请尝试其中一个。这可能是解决方案。

修改

要将其更改为依赖项属性,请执行以下操作:

public ObservableCollection<TestFieldView> Fields
{
    get { return (ObservableCollection<TestFieldView>)GetValue(FieldsProperty); }
    set { SetValue(FieldsProperty, value); }
}

public static readonly DependencyProperty FieldsProperty =
    DependencyProperty.Register("Fields", typeof(ObservableCollection<TestFieldView>), typeof(MainWindow),
    new UIPropertyMetadata(new ObservableCollection<TestFieldView>()));

答案 2 :(得分:0)

您确定这是绑定是否连接到正确的数据?

我更喜欢
{Binding Fields,RelativeSource={RelativeSource TemplatedParent}}
来自用户控件的

绑定方法,但它应该以任何一种方式工作(只要你确定它的绑定它无关紧要(可能取决于你如何创建控件的实例)

您似乎没有与TestFieldView项目或任何内容关联的样式或DataTemplate? 此外,由于您使用的是ItemsControl,因此您可能还需要定义ItemsPaneltemplate。

<ItemsControl Grid.Row="1" ItemsSource="{Binding Fields}">
   <ItemsControl.ItemsPanel>
     <ItemsPanelTemplate>
        <UniformGrid Rows="1" />
     </ItemsPanelTemplate>
   </ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
    <DataTemplate>
       <CheckBox Content="{Binding  Name}" IsChecked="{Binding  IsSelected}"/>
    </DataTemplate>
</ItemsControl.ItemTemplate>

不确定没有得到你的代码并搞乱它直到它的工作,但它可能是项目控制,面板模板,数据模板方面的东西。

虽然如果我完全误解你可以尝试用ListView替换ItemsControl(因为这至少应该显示一个类名列表),这会给你一些显示然后你可以在那里工作。