2011-01-17 18 views
0

Ich muss alte und neue Werte in meiner ListView zeigen, wenn der Datensatz geändert wird. Ich meine jede Zelle sollte neuen Wert und alten Wert zeigen. Denn jetzt mache ich so:Doppelte Werte in ListView-Zelle

<GridViewColumn.CellTemplate> 
    <DataTemplate> 
     <StackPanel> 
       <TextBlock Text="{Binding MyValue}"/> 
       <TextBlock Margin="7,0,0,0" Text="{Binding old.MyValue}"/> 
     </StackPanel> 
    </DataTemplate> 
</GridViewColumn.CellTemplate> 

für die nächste Spalte wird es sein:

<GridViewColumn.CellTemplate> 
    <DataTemplate> 
     <StackPanel> 
       <TextBlock Text="{Binding MySecondValue}"/> 
       <TextBlock Margin="7,0,0,0" Text="{Binding old.MySecondValue}"/> 
     </StackPanel> 
    </DataTemplate> 
</GridViewColumn.CellTemplate> 

Aber ich habe 10 Spalten und das ist nicht so interessant, viele Copy-Paste zu machen für alle 10 Spalten.

Irgendwelche Ideen, wie dies kompakter und besser gemacht werden kann?

Die ideale Variante I ist so etwas wollen:

<GridViewColumn.CellTemplate> 
    <DataTemplate> 
     <MySpecialWhatever NewValueText="{Binding MyValue}" OldValueText="{Binding old.MyValue}" > 
     </MySpecialWhatever> 
    </DataTemplate> 
</GridViewColumn.CellTemplate> 

Antwort

1

Sie können Ihr Ziel mit benutzerdefinierten Usercontrol wie dieses Ziel zu erreichen.

DoubleValuesCell.xaml

<UserControl x:Class="WpfApplication1.DoubleValuesCell" 
      x:Name="root" 
      ...> 
    <StackPanel> 
     <TextBlock Text="{Binding NewValue, ElementName=root}"/> 
     <TextBlock Margin="7,0,0,0" Text="{Binding OldValue, ElementName=root}"/> 
    </StackPanel> 
</UserControl> 

DoubleValuesCell.xaml.cs

public partial class DoubleValuesCell : UserControl 
{ 
    public static readonly DependencyProperty NewValueProperty = DependencyProperty.Register("NewValue", typeof(object), typeof(DoubleValuesCell)); 

    public static readonly DependencyProperty OldValueProperty = DependencyProperty.Register("OldValue", typeof(object), typeof(DoubleValuesCell)); 

    public object NewValue 
    { 
     get { return GetValue(NewValueProperty); } 
     set { SetValue(NewValueProperty, value); } 
    } 

    public object OldValue 
    { 
     get { return GetValue(OldValueProperty); } 
     set { SetValue(OldValueProperty, value); } 
    } 

    public DoubleValuesCell() 
    { 
     InitializeComponent(); 
    } 
} 

XXXWindow.xaml

<Window x:Class="WpfApplication1.XXXWindow" 
     xmlns:local="clr-namespace:WpfApplication1" 
     ...> 
    ... 
     <GridViewColumn> 
      <GridViewColumn.CellTemplate> 
       <DataTemplate> 
        <local:DoubleValuesCell NewValue="{Binding MyValue}" OldValue="{Binding old.MyValue}"/> 
       </DataTemplate> 
      </GridViewColumn.CellTemplate> 
     </GridViewColumn> 
    ... 
</Window> 

UPDATE

Sie können das zweite Steuerelement mit DataTrigger reduzieren.

Der obige Code bedeutet, dass der zweite TextBlock reduziert ist, wenn der Bindungsquellwert (OldValue-Eigenschaft) null ist.

+0

Vielen Dank. Es scheint, das ist der einzige Weg. Obwohl ich hoffte, XAML nur Code zu verwenden, ohne C# und ohne neue Kontrolle zu erstellen. –

+0

Kann ich diese Klasse irgendwie verwenden, wenn ich in einem Fall - TextBlock und in einem anderen Fall - Button verwenden möchte? –

+0

Ich möchte das zweite Steuerelement ausblenden, wenn keine Daten darin enthalten sind. Ich habe hinzugefügt: öffentliches Objekt OldValueVisibility { get { return (OldValue == null)? Visibility.Collapsed: Visibility.Visible; } } } und binden Sie es wie Visibility = "{Binding OldValueVisibility}", aber es hilft nicht –