0

レコードが変更されたときに、ListViewに古い値と新しい値を表示する必要があります。つまり、各セルは新しい値と古い値を表示する必要があります。今のところ私はそうしています:

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

次の列は次のようになります。

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

しかし、私には10の列があり、これは10の列すべてに多くのコピーアンドペーストを作成するのにそれほど面白くありません。

これをよりコンパクトに、より良くする方法はありますか?

私が欲しい理想的なバリアントは次のようなものです:

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

1 に答える 1

1

このようなカスタムUserControlを使用して目標を達成できます。

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>

アップデート

DataTriggerを使用して2番目のコントロールを折りたたむことができます。

<StackPanel>
    <TextBlock Text="{Binding NewValue, ElementName=root}"/>
    <TextBlock Margin="7,0,0,0" Text="{Binding OldValue, ElementName=root}">
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding OldValue, ElementName=root}" Value="{x:Null}">
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
</StackPanel>

上記のコードは、バインディングソース値(OldValueプロパティ)がnullの場合、2番目のTextBlockが折りたたまれていることを意味します。

于 2011-01-18T13:00:01.213 に答える