2010-11-11 112 views
0

我试图使用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,也不会以某种方式添加。

谢谢!

回答

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"> 

或者只是为了排除故障,删除视图和运行代码,如果列表视图没有按” t显示绑定的问题所在。

+0

摆脱路径没有帮助。 摆脱视图的工作(如它显示的形状),但它只是在垂直线的形状,我想使用ViewBase为了使用wrappanel。 – mmod 2010-11-12 15:55:20

0

好了现在我明白了:d

我是currentky上一个项目,也需要一个普莱恩维尔工作,这是我怎么做的:

<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> 

我普莱恩维尔使用大致相同的代码背后作为你的,这个标记包装我的图标很容易,所以我认为它可以帮助你

+0

在任何方面都有帮助吗? – 2010-11-18 06:20:11