wpf 数据模板绑定数据模板内的项源

368yc8dk  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(177)

我想将ObservableCollection绑定到数据模板内的Itemscontrol,也就是另一个数据模板内的Itemscontrol:

<ListView x:Name="list_befehlsfolge" Margin="5">
    <ListView.ItemTemplate>
        <DataTemplate DataType="{x:Type local:Befehlszeile}" >
            <Expander Margin="5" Header="{Binding Path=Bezeichnung,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                <ItemsControl ItemsSource="{Binding Path=SubBefehlsliste}">
                    <DataTemplate DataType="{x:Type local:SubZeile_Text}">
                        <TextBox Text="{Binding Path=text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>
                    </DataTemplate>
                </ItemsControl>
            </Expander>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

用代码隐藏将源代码绑定到list_befehlsfolge.Itemsource是没有问题的,但是如何绑定SubBefehlsliste呢?
当我创建一个SubBefehlsliste的新示例时

public class Befehlszeile : Position
{
    public string Bezeichnung { get; set; } = "Befehlsname";
 
    // crash at this line:  
    public ObservableCollection<Position> SubBefehlsliste { get; set; } = new ObservableCollection<Position>();
   
    public Befehlszeile()
    {
        //  SubBefehlsliste.Add(new SubZeile_Text());
    }
}

它崩溃并显示错误
无效操作异常错误:使用“ItemsSource”时操作无效。请改用ItemsControl.ItemsSource来访问和修改项。
(位置是SubZeile_Text等所有数据类型的“母”类,用于将所有数据类型添加到ObservableCollection)

vql8enpb

vql8enpb1#

您忘记指定模板的属性。因此,您指定的模板试图添加到ItemsControl.Items集合中。
但不能同时使用ItemsSource和项目。
另一个不可思议的时刻:在Sharpe代码中,您将Position类用于集合的元素,而在Data Template中,您将设置local:SubZeile_Text类型。
以下哪个选项是正确的?

<ListView x:Name="list_befehlsfolge" Margin="5">
    <ListView.ItemTemplate>
        <DataTemplate DataType="{x:Type local:Befehlszeile}" >
            <Expander Margin="5" Header="{Binding Path=Bezeichnung,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                <ItemsControl ItemsSource="{Binding Path=SubBefehlsliste}">
                    <!--Forgotten this line below-->
                    <ItemsControl.ItemTemplate>
                        <DataTemplate DataType="{x:Type local:Position}">
                            <TextBox Text="{Binding Path=text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </Expander>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

附言提示:如果不定义列,则使用ListBox,而不是ListView。

fwzugrvs

fwzugrvs2#

最后我发现了问题,数据模板必须在“<ListView.Resources>“和“<ItemsControl.Resources>“内:

<ListView x:Name="list_befehlsfolge" Margin="5">
        <ListView.Resources>
            <DataTemplate DataType="{x:Type local:Befehlszeile}" >
                <Expander Margin="5" Header="{Binding Path=Bezeichnung,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                    <ItemsControl ItemsSource="{Binding Path=SubBefehlsliste}">
<ItemsControl.Resources>
                        <DataTemplate DataType="{x:Type local:SubZeile_Text}">
                            <TextBox Text="{Binding Path=text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>
                        </DataTemplate>
</ItemsControl.Resources>
                    </ItemsControl>
                </Expander>
            </DataTemplate>
        </ListView.Resources>
    </ListView>

相关问题