2010-11-11 7 views
0

J'essaie d'utiliser ViewBase pour lier certaines données à un ListView sur un clic de bouton. Cela ne semble pas fonctionner et je ne sais pas ce que je fais de mal. Voici un court programme autonome qui reflète ce problème:Liaison de données à un ViewBase

fenêtre principale:

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

Mon 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; 
    } 
    } 
} 

Le style Voir:

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

Et l'objet J'utilise:

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)); 
     } 
    } 
    } 
} 

J'ai utilisé snoop pour vérifier s'il y a une erreur de liaison, mais il semble que la listview n'a même pas d'enfant, donc le PlainView n'est pas ajouté d'une manière ou d'une autre dans le XAML.

Merci!

Répondre

0

Je ne pense pas qu'il y ait quelque chose de mal avec la vue.

Je pense que le problème se trouve ici:

<ListView ItemsSource="{Binding Path=.,Source={StaticResource ShapeProvider}}" 
    ItemContainerStyle="{StaticResource ItemContainerStyle1}" x:Name="ListView1" Height="113" VerticalAlignment="Bottom"> 

essayer ceci:

<ListView ItemsSource="{Binding Source={StaticResource ShapeProvider}}" 
    ItemContainerStyle="{StaticResource ItemContainerStyle1}" x:Name="ListView1" Height="113" VerticalAlignment="Bottom"> 

ou tout simplement pour le dépannage, retirez la vue et exécuter votre code, si le listview n » t afficher tout le problème réside dans la liaison.

+0

Se débarrasser du chemin n'a pas aidé. Se débarrasser de la vue a travaillé (comme il a montré les formes), mais c'était juste les formes dans une ligne verticale, et je veux utiliser la ViewBase afin d'utiliser le wrappanel. – mmod

0

Ok maintenant je vois: D

je suis currentky travaille sur un projet qui a besoin aussi un Plainview, voilà comment je l'ai fait:

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

Mon Plainview utilise sur le même code derrière comme le vôtre, et ce balisage enveloppe mes icônes avec facilité, donc je pense que cela pourrait vous aider

+0

était-ce utile d'une manière ou d'une autre? –

Questions connexes