C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: WPF DataGrid 再描画


(過去ログ 113 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■66839 / inTopicNo.1)  WPF DataGrid 再描画
  
□投稿者/ コタロウ (1回)-(2013/05/30(Thu) 13:29:24)

分類:[C#] 

開発環境
Windows 7
Visual Studio 2012
C#
WPF

DataGridにComboBoxカラムがあります。
そのComboBoxカラムの内容によって
セルの背景色を変更したいです。

@画面表示し、ComboBoxの値を変更
ADataGridをスクロールし、@で変更したセルを見えなくする
BDataGridをスクロールし、@で変更したセルを見えるようにする

わかりにくいかもしれませんが、
上記処理をおこなった場合、
@では、色の変更がされず、
Bで色変更されました。

ComboBoxの値によって色変更されていることは確認済みですので
おそらく、DataGridの再描画のタイミングによるものだと思うのですが

DataGridの再描画を強制的に行うことはできますか?
また、画面の再描画を強制的に行うことはできますか?

WPFでは、FormにあったDoEvents関数やUpDate関数がないようなのですが
何かよい方法はありますでしょうか?
引用返信 編集キー/
■66861 / inTopicNo.2)  Re[1]: WPF DataGrid 再描画
□投稿者/ ひらぽん (1回)-(2013/05/31(Fri) 15:16:25)
ひらぽん さんの Web サイト
> DataGridにComboBoxカラムがあります。
> そのComboBoxカラムの内容によって
> セルの背景色を変更したいです。
> 
> @画面表示し、ComboBoxの値を変更
> ADataGridをスクロールし、@で変更したセルを見えなくする
> BDataGridをスクロールし、@で変更したセルを見えるようにする
> 
> わかりにくいかもしれませんが、
> 上記処理をおこなった場合、
> @では、色の変更がされず、
> Bで色変更されました。

ComboBoxカラムの内容によってセルの背景色を変更するようトリガーを使ったサンプルを書いてみました。
http://d.hatena.ne.jp/hilapon/20130530/1369903705

上記では問題なく背景色は変更されますが、もしかしてイベントハンドラで背景色を変更するよう実装してますか?

引用返信 編集キー/
■66862 / inTopicNo.3)  Re[2]: WPF DataGrid 再描画
□投稿者/ コタロウ (2回)-(2013/05/31(Fri) 15:54:35)
2013/05/31(Fri) 15:59:49 編集(投稿者)

No66861 (ひらぽん さん) に返信
返信ありがとうございます。

> ComboBoxカラムの内容によってセルの背景色を変更するようトリガーを使ったサンプルを書いてみました。
> http://d.hatena.ne.jp/hilapon/20130530/1369903705
>
> 上記では問題なく背景色は変更されますが、もしかしてイベントハンドラで背景色を変更するよう実装してますか?

申し訳ありません、セルではなく、行全体の色を変更していました。

また、説明不足で申し訳ありません。下記に捕捉します。

public enum EntryType
{
NONE,
YES,
NO,
}

public class Person
{
/// <summary>
/// 名前
/// </summary>
public string Name { get; set; }
/// <summary>
/// 参加
/// </summary>
public EntryType Entry { get; set; }
/// <summary>
/// 備考
/// </summary>
public string Other { get; set; }
/// <summary>
/// セル背景色
/// </summary>
public string BackColor
{
get
{
if (Entry == EntryType.YES)
return "Cyan";
else if (Entry == EntryType.NO)
return "LightPink";
else
return "White";
}
}
  }


別クラス
public ObservableCollection<Person> PersonList
{
get;
set;
}

上記が定義済みです。
※PersonListには値が入っている前提です。

そこで、xamlで
DataGridのItemsSourceにPersonListをバインドし、
DataGrid.ItemContainerStyleで、DataTriggerを指定しています。

<DataGrid ItemsSource="{Binding PersonList}">
<DataGrid.ItemContainerStyle>
<Style TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<DataTrigger Binding="{Binding BackColor}" Value="Cyan">
<Setter Property="Background" Value="Cyan" />
</DataTrigger>
<DataTrigger Binding="{Binding BackColor}" Value="LightPink">
<Setter Property="Background" Value="LightPink" />
</DataTrigger>
<DataTrigger Binding="{Binding BackColor}" Value="White">
<Setter Property="Background" Value="White" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.ItemContainerStyle>
</DataGrid>

上記処理では、Entryカラムを変更しても色変更されませんでした。
なにか、おかしなところはありますか?

Prismを使用していますが関係あるのでしょうか。
質問ばかりで申し訳ありません。
引用返信 編集キー/
■66869 / inTopicNo.4)  Re[3]: WPF DataGrid 再描画
□投稿者/ Hongliang (57回)-(2013/05/31(Fri) 20:04:49)
PersonがINotifyPropertyChangedを実装していませんが。
Entryのsetで、"BackColor"についてもPropertyChangedを起こす必要があります。
引用返信 編集キー/
■66893 / inTopicNo.5)  Re[4]: WPF DataGrid 再描画
□投稿者/ コタロウ (3回)-(2013/06/03(Mon) 08:31:04)
2013/06/03(Mon) 08:51:26 編集(投稿者)

No66869 (Hongliang さん) に返信
ありがとうございます。
返信遅くなり申し訳ありません。

> PersonがINotifyPropertyChangedを実装していませんが。
> Entryのsetで、"BackColor"についてもPropertyChangedを起こす必要があります。

using Microsoft.Practices.Prism.ViewModel;
public class Person : NotificationObject
{
/// <summary>
/// 参加
/// </summary>
public EntryType Entry
{
get { return _entry; }
set
{
_entry = value;
RaisePropertyChanged(() => BackColor);
}
}
private EntryType _entry;
}

とすることでリアルタイムに更新することができました。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -