【问题标题】:WPF ListView ItemTemplate Cannot set properties on property elementsWPF ListView ItemTemplate 无法在属性元素上设置属性
【发布时间】:2020-10-12 09:44:15
【问题描述】:

我正在 WPF 中处理 ListView,我希望 ListViewViewModel 获取 ItemLists 但我收到以下错误 无法在属性元素上设置属性

xml代码:

<ListView ItemsSource="{Binding MenuItems}" Name="mainSideMenuList" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Background="#FF284593" Foreground="#FF3457D1">
   <i:Interaction.Triggers>
      <i:EventTrigger EventName="MouseDoubleClick">
         <i:InvokeCommandAction
            Command="{Binding Command}"
            CommandParameter="{Binding ElementName=mainSideMenuList, Path=SelectedItem}" />
      </i:EventTrigger>
   </i:Interaction.Triggers>
   <ListView.ItemTemplate Height="60">
      <DataTemplate>
         <StackPanel Orientation="Horizontal">
            <materialDesign:PackIcon Kind="{Binding IconKind}" Width="25" Height="25" Margin="10" VerticalAlignment="Center"/>
            <TextBlock Text="{Binding Name}" VerticalAlignment="Center" Margin="10 10" />
         </StackPanel>
      </DataTemplate>
   </ListView.ItemTemplate>
</ListView>

视图模型:

private readonly ItemHandler _itemHandler;
private ICommand _command;
public MainWindowViewModel() {
 _itemHandler = new ItemHandler();
 _itemHandler.Add(new Item("Settings", PackIconKind.Settings));
 _itemHandler.Add(new Item("Products", PackIconKind.FoodForkDrink));
 _itemHandler.Add(new Item("Tickets", PackIconKind.Ticket));
 _itemHandler.Add(new Item("Entities", PackIconKind.Table));
 _itemHandler.Add(new Item("Accounts", PackIconKind.Calculator));
 _itemHandler.Add(new Item("Inventory", PackIconKind.Database));
 _itemHandler.Add(new Item("Printing", PackIconKind.Printer));
 _itemHandler.Add(new Item("Reports", PackIconKind.FileAccount));
 _itemHandler.Add(new Item("Automation", PackIconKind.Calculator));
 _itemHandler.Add(new Item("Users", PackIconKind.User));
}
public List < Item > MenuItems {
 get {
  return _itemHandler.MenuItems;
 }
}
public ICommand Command {
 get {
  return _command ? ? (_command = new RelayCommand(x => {
   DoStuff(x as Item);
  }));
 }
}

private void DoStuff(Item item) {
 MessageBox.Show(item.Name + " element clicked");
}

我做错了什么,我该如何解决?

【问题讨论】:

  • 您的 ViewModel 需要实现 INotifyPropertyChanged 接口才能让 Bindind 工作。 docs.microsoft.com/en-us/dotnet/framework/wpf/data/…
  • 我的模型实现了INotifyPropertyChanged。列表项显示在设计器中,但运行时出现错误
  • ListView.ItemTemplateproperty 而不是 type。属性没有属性,但类型有。属性存储对其类型实例的引用。在 XAML 的 Property Element Syntax 中,&lt;ListView.ItemTemplate&gt; 是一个属性元素。知道了这一点,您现在应该能够理解错误消息:“无法在属性元素上设置属性”

标签: c# wpf xaml listview itemtemplate


【解决方案1】:

问题在于ListView.ItemTemplate 的类型为DataTemplate,它不是FrameworkElement,因此它不能有任何HeightWidth 或与UI-Elements 相关的任何其他内容。它只能有一个Content,这是一个DataTemplate,它可以容纳一个FrameworkElement,主要是一个Panel。然后这些元素可以具有heightwidth 或任何UI-Element 属性。

因此删除&lt;ListView.ItemTemplate Height="60"&gt;Height并将其设置为&lt;StackPanel Orientation="Horizontal"&gt;

【讨论】:

  • 差不多。正确的解释是,ListView.ItemTemplate 是 property 而不是 type。属性没有属性,但类型有。属性存储对其类型实例的引用。
  • 谢谢@dstreissi。实际上,当我早些时候进行尝试和错误时,我发现了这一点。我已经删除了Height 属性
猜你喜欢
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多