我試圖使用ViewBase將某些數據綁定到按鈕單擊上的ListView。它似乎沒有工作,我不知道我做錯了什麼。下面是反映了這個問題一個簡短的自我包含的程序:將數據綁定到ViewBase
主窗口:
<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,也不會以某種方式添加。
謝謝!
擺脫路徑沒有幫助。 擺脫視圖的工作(如它顯示的形狀),但它只是在垂直線的形狀,我想使用ViewBase爲了使用wrappanel。 – mmod 2010-11-12 15:55:20