XAML WPF将ListView项目DataTemplate放到单独的文件中

lqfhib0f  于 2023-05-11  发布在  其他
关注(0)|答案(1)|浏览(135)

我有一个简单的任务,但有点困惑。所以,我有一个ListView在我的一些窗口,我有一个自定义的ListView项目,我把在单独的文件调用“ListViewItem.xaml”,我做了一个自定义的样式,我的ListView在“Styles.Constrols.ListView.Xaml”。我的“MyListViewItem.xaml”看起来像这样:

<UserControl x:Class="SomeApp.Views.MyListViewItem"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="40" 
             d:DesignWidth="400"
             Margin="0">
    <StackPanel Orientation="Horizontal">
        <Button Height="40" Width="60" Content="{Binding Id}" Foreground="Chartreuse"  />
        <ComboBox Margin="2 0 0 0" ItemsSource={Binding Values}/>
    </StackPanel>
</UserControl>

我的“Styles.Constrols.ListView.Xaml”是:

<Style x:Key="Style.ListViews.MainWindow.CenterPanel" TargetType="{x:Type ListView}">     
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <views:MyListViewItem/>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>

目前一切正常,但当我尝试将MyListViewItem的类型从UserControl更改为ListViewItem时,我在这一行得到一个错误

<DataTemplate>
   <views:MyListViewItem/>
</DataTemplate>

属性“visual tree”不支持“ListViewItem”类型的值

当我做这个小把戏时:

<DataTemplate>
    <ListViewItem 
     xmlns....>
        <StackPanel Orientation="Horizontal">
            <Button Height="40" Width="60" Content="{Binding Id}" Foreground="Chartreuse"  />
            <ComboBox Margin="2 0 0 0" ItemsSource={Binding Values}/>
        </StackPanel>
    </ListViewItem >
</DataTemplate>

它变得很好。这种行为的意义是什么?
所以我的问题如下

  • 是否有必要使用UserControl的所有元素,我们想把从窗口布局(为了更好的可读性)到单独的.xaml文件?
  • ListViewItem和UserControl都是ContentControl的子控件,为什么我不能使用ListViewItem,当我把它的布局放在单独的文件?
gk7wooem

gk7wooem1#

以下应该可以工作。

MyListViewItem.xaml:

<ListViewItem x:Class="SomeApp.Views.MyListViewItem"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <StackPanel Orientation="Horizontal">
        <Button Height="40" Width="60" Content="{Binding Id}" Foreground="Chartreuse"  />
        <ComboBox Margin="2 0 0 0" ItemsSource="{Binding Values}"/>
    </StackPanel>
</ListViewItem>

MyListViewItem.xaml.cs:

namespace SomeApp.Views
{
    /// <summary>
    /// Interaction logic for MyListViewItem.xaml
    /// </summary>
    public partial class MyListViewItem : ListViewItem
    {
        public MyListViewItem()
        {
            InitializeComponent();
        }
    }
}

是否有必要使用UserControl的所有元素,我们想把从窗口布局(为了更好的可读性)到单独的.xaml文件?
不知道
ListViewItem和UserControl都是ContentControl的子控件,为什么我不能使用ListViewItem,当我把它的布局放在单独的文件?
你可以的

相关问题