我正在尝试使用ViewBase在点击按钮时将一些数据绑定到ListView。它似乎不起作用,我不知道我做错了什么。这是一个反映这个问题的简短自包含程序:
主窗口:
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication2;assembly="
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate x:Key="ListViewItemTemplate" DataType="ListViewItem">
<Border Name="LastBorder">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Rectangle Height="{Binding Height}" Width="{Binding Width}" Fill="{Binding Fill}"/>
</Grid>
</Border>
</DataTemplate>
<Style TargetType="ListViewItem" x:Key="ItemContainerStyle1">
<Setter Property="VerticalAlignment" Value="Top" />
</Style>
<ObjectDataProvider x:Key="ShapeProvider" />
</Window.Resources>
<Grid>
<Button Content="Bind data" Click="Button_Click" Height="20" Width="80" Margin="12,12,410,278" />
<ListView ItemsSource="{Binding Path=.,Source={StaticResource ShapeProvider}}"
ItemContainerStyle="{StaticResource ItemContainerStyle1}" x:Name="ListView1" Height="113" VerticalAlignment="Bottom">
<ListView.View>
<local:PlainView ItemWidth="148" ItemHeight="250"
ItemTemplate="{StaticResource ListViewItemTemplate}" />
</ListView.View>
</ListView>
</Grid>
</Window>
我的ViewBase:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WpfApplication2
{
public class PlainView : ViewBase
{
public static readonly DependencyProperty ItemContainerStyleProperty =
ItemsControl.ItemContainerStyleProperty.AddOwner(typeof(PlainView));
public Style ItemContainerStyle
{
get { return (Style)GetValue(ItemContainerStyleProperty); }
set { SetValue(ItemContainerStyleProperty, value); }
}
public static readonly DependencyProperty ItemTemplateProperty =
ItemsControl.ItemTemplateProperty.AddOwner(typeof(PlainView));
public DataTemplate ItemTemplate
{
get { return (DataTemplate)GetValue(ItemTemplateProperty); }
set { SetValue(ItemTemplateProperty, value); }
}
public static readonly DependencyProperty ItemWidthProperty =
WrapPanel.ItemWidthProperty.AddOwner(typeof(PlainView));
public double ItemWidth
{
get { return (double)GetValue(ItemWidthProperty); }
set { SetValue(ItemWidthProperty, value); }
}
public static readonly DependencyProperty ItemHeightProperty =
WrapPanel.ItemHeightProperty.AddOwner(typeof(PlainView));
public double ItemHeight
{
get { return (double)GetValue(ItemHeightProperty); }
set { SetValue(ItemHeightProperty, value); }
}
protected override object DefaultStyleKey
{
get
{
ComponentResourceKey key = new ComponentResourceKey(GetType(), "PlainViewRsx");
return key;
}
}
public PlainView()
{
ItemWidth = 40;
ItemHeight = 20;
}
}
}
视图样式:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication2">
<!--PlainView Default Style for ListView-->
<Style x:Key="{ComponentResourceKey
TypeInTargetAssembly={x:Type local:PlainView},
ResourceId=PlainViewRsx}"
TargetType="{x:Type ListView}"
BasedOn="{StaticResource {x:Type ListBox}}">
<!--
Width="{Binding (FrameworkElement.ActualWidth), RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}"
-->
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="ItemContainerStyle"
Value="{Binding (ListView.View).ItemContainerStyle, RelativeSource={RelativeSource Self}}" />
<Setter Property="ItemTemplate"
Value="{Binding (ListView.View).ItemTemplate, RelativeSource={RelativeSource Self}}" />
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<WrapPanel HorizontalAlignment="Stretch"
Width="{Binding (FrameworkElement.ActualWidth), RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}"
ItemWidth="{Binding (ListView.View).ItemWidth, RelativeSource={RelativeSource AncestorType=ListView}}"
MinWidth="{Binding (ListView.View).ItemWidth, RelativeSource={RelativeSource AncestorType=ListView}}"
ItemHeight="{Binding (ListView.View).ItemHeight, RelativeSource={RelativeSource AncestorType=ListView}}" />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
我正在使用的对象:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Windows.Media;
namespace WpfApplication2
{
public class RectShapes : INotifyPropertyChanged
{
public int Height { get; set; }
public int Width { get; set; }
public SolidColorBrush Fill { get; set; }
public RectShapes()
{
Width = 98;
Height = 152;
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
}
我使用snoop检查是否存在绑定错误,但似乎listview甚至没有子节点,因此即使我在XAML中设置了集合,也不会以某种方式添加PlainView。
谢谢!
答案 0 :(得分:0)
我认为这个观点没有任何问题。
我认为问题可以在这里找到:
<ListView ItemsSource="{Binding Path=.,Source={StaticResource ShapeProvider}}"
ItemContainerStyle="{StaticResource ItemContainerStyle1}" x:Name="ListView1" Height="113" VerticalAlignment="Bottom">
试试这个:
<ListView ItemsSource="{Binding Source={StaticResource ShapeProvider}}"
ItemContainerStyle="{StaticResource ItemContainerStyle1}" x:Name="ListView1" Height="113" VerticalAlignment="Bottom">
或仅用于故障排除,删除视图并运行代码,如果listview没有显示任何问题,那么绑定就会出现问题。
答案 1 :(得分:0)
好的,我现在看到了:D
我目前正在开发一个也需要普通视图的项目,这就是我这样做的方式:
<Window.Resources>
<DataTemplate x:Key="iconTemplate">
<DockPanel Height="40" Width="150">
<Image Margin="6" Height="30" Width="30"
Stretch="Uniform"
Source={Binding Pic}>
</Image>
<TextBlock DockPanel.Dock="Top" Text="{Binding Title}"
FontSize="13" HorizontalAlignment="Left"
Margin="0,0,0,3"/>
<TextBlock Text="{Binding Artist}" FontSize="9"
HorizontalAlignment="Left" Margin="0,0,0,3"/>
</DockPanel>
<my:PlainView x:Key="iconView"
ItemTemplate="{StaticResource iconTemplate}"
ItemWidth="300"/>
</Window.Resources>
我的普通视图使用与您相同的代码,这个标记轻松包装我的图标,所以我认为它可以帮助你