0

DataGrid コントロールを含み、C# WPF DataGrid で次のシナリオを有効にする WPF ウィンドウを作成したいと思います。それ以外の場合は赤。この動作をプログラムする最もクリーンな方法は何ですか? この種の検証を行うために、DataGrid と WPF に組み込み機能はありますか?

編集:今のところ、RowStyle を使用してこれを実行することができましたが、各行の検証に時間がかかるため、アプリケーションが応答しなくなるため、これを非同期で並列にしたいと考えています。

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
        <Setter Property="Background" Value="{Binding BgColor}">
        </Setter>
    </Style>
</DataGrid.RowStyle>

EDIT2:ここに進行状況があります:

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=BgColor}" Value="DarkRed">
                <Setter Property="Background" Value="DarkRed"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</DataGrid.RowStyle>

コードビハインドは次のようになります。

Func<List<bool>> func = () => data.AsParallel().Select(x => File.Exists(x.FullPath)).ToList();
List<bool> res = null;
IAsyncResult ar = func.BeginInvoke(new AsyncCallback(x=>
{
    res = ((Func<List<bool>>)((AsyncResult)x).AsyncDelegate).EndInvoke(x);
    for (int i = 0; i < res.Count; ++i)
        if (!res[i])
            data[i].BgColor = Brushes.DarkRed;
}), null);

残っている問題は、行が再描画されたときにのみ行の背景色が更新されることです (ビューの外に移動し、再びビューに移動します)。これを修正するクリーンで簡単な方法はありますか?

EDIT3: 最後に、すべてが必要に応じて正確に機能します。EDIT2 に欠けているのは、データ ソース クラスに INotifyPropertyChanged を実装することだけでした。

4

1 に答える 1

2

最良のアプローチはDataTrigger、 のスタイルでを使用し、にバインドされた ViewModel でDataGridItemsプロパティ () を提供することです。で、3 つの状態すべてのビジュアルを宣言できます。bool?DataTriggerDataTriggerNull, True, False

の追加情報についてDataTriggerは、こちらをご覧ください

編集

うーん、ハイライト機能をに入れるチャンスはありDataTemplateますか?エンティティの選択状態の強調表示を実装しました。そして、それは期待どおりに機能します。

<DataTemplate.Triggers>
  <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}"
                  Value="true">
  <!-- Expand -->
  <DataTrigger.EnterActions>
    <BeginStoryboard>
      <Storyboard Storyboard.TargetName="CommandPanel">
        <DoubleAnimation Duration="0:0:0.200" Storyboard.TargetProperty="Opacity" To="1" />
        <DoubleAnimation Duration="0:0:0.150" Storyboard.TargetProperty="Height"
                            To="{StaticResource TargetHeightCommandPanel}" />
      </Storyboard>
    </BeginStoryboard>
  </DataTrigger.EnterActions>
  <!-- Collapse -->
  <DataTrigger.ExitActions>
      <BeginStoryboard>
        <Storyboard Storyboard.TargetName="CommandPanel">
          <DoubleAnimation Duration="0:0:0.100" Storyboard.TargetProperty="Opacity" To="0" />
          <DoubleAnimation Duration="0:0:0.150" Storyboard.TargetProperty="Height" To="0" />
        </Storyboard>
      </BeginStoryboard>
    </DataTrigger.ExitActions>
  </DataTrigger>
</DataTemplate.Triggers>

ところで、MVVM について聞いたことがありますか?

于 2012-12-10T16:51:02.063 に答える