ItemsControl с ItemSource, установленным в ObservableCollection UserControls, не удается отобразить в визуальном дереве - PullRequest
3 голосов
/ 19 сентября 2010

внутри 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 ]

2 голосов
/ 22 сентября 2010

Я могу воссоздать вашу ситуацию, только если по какой-то причине LoadComponent не вызывается в вашем UserControl (TestFieldView) и Xaml не анализируется правильно. Это происходит в InitializeComponent (см., Например, Что делает InitializeComponent () и как это работает в WPF? ). Вы уверены, что вызываете его в конструкторе TestFieldView?

0 голосов
/ 21 сентября 2010

Вы уверены, что это привязка подключается к правильным данным? Я предпочитаю

{Binding Fields,RelativeSource={RelativeSource TemplatedParent}}

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

У вас, кажется, нет стиля или шаблона данных, связанных с вашим элементом TestFieldView или чем-то еще? Кроме того, поскольку вы используете 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>

Не уверен, если не овладеть вашим кодом и не возиться с ним до тех пор, пока он не заработает, но, вероятно, это что-то вроде элемента управления элементами, шаблона панели, шаблона данных.

Хотя, если я полностью неправильно понимаю, вы можете попробовать заменить ItemsControl на ListView (так как это должно по крайней мере показать вам список имен классов), который даст вам какое-то отображение, тогда вы можете работать оттуда.

0 голосов
/ 21 сентября 2010

Является ли свойство "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>()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...