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