Hatena::ブログ(Diary)

当面C#と.NETな記録 このページをアンテナに追加 RSSフィード

2009/9/29 (火)

[] 「基本要素の概要」の図  「基本要素の概要」の図を含むブックマーク  「基本要素の概要」の図のブックマークコメント

f:id:siokoshou:20090929150512j:image

http://msdn.microsoft.com/ja-jp/library/ms743618.aspx

この MSDN ライブラリの記事に欠けている図を勝手に描いてみた。

クラス名に出てくる Element は HTML の「要素」(タグと言われることのほうが多い)と思えばよい。

WPF は汎用性高すぎなせいか、カラクリを理解しないと使いこなせない面があるように思います。

トラックバック - http://d.hatena.ne.jp/siokoshou/20090929

2009/9/27 (日)

[] XAML名前空間の謎が解けた  XAML の名前空間の謎が解けたを含むブックマーク  XAML の名前空間の謎が解けたのブックマークコメント

via http://social.msdn.microsoft.com/Forums/ja-JP/wpfja/thread/a0ed39c6-22c7-4ab3-8ac0-af775d02c91c/

XAML で使う XML 名前空間 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ってどういうカラクリなんだろうと不思議だったけど、XmlnsDefinitionAttribute クラスを使って XML 名前空間に CLR 名前空間を結びつけることができるんだそうな。なるほどー。

AssemblyInfo.cs あたりに

[assembly: System.Windows.Markup.XmlnsDefinition( "http://siokoshou", "Hoge.Fuga" )]

と書く。

そして、XAML で xmlns:snp="http://siokoshou" とすると snp:Puyo のように参照できると。

使い方はこちらが詳しいです。

http://blogs.wankuma.com/kzt/archive/2009/01/09/166020.aspx

ちなみに試してみたら、<DataTemplate DataType="{x:Type snp:PuyoViewModel}"> のように x:Type を使うと型が見つからないって怒られた。DataType="snp:PuyoViewModel" と書くと OK でした。

  • OK …… <DataTemplate DataType="snp:PuyoViewModel">
  • NG …… <DataTemplate DataType="{x:Type snp:PuyoViewModel}">

この2つはまったく同じことだと思ってたのに、違うんだねぇ。バグなのかわざとなのか微妙だけどw

WPFアセンブリには

[assembly: System.Windows.Markup.XmlnsDefinition( "http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows" )]

のようなのがズラズラ並んでると思われ。そうやってたくさんのクラスが一つの XML 名前空間で見えるようになってるんですね。

というわけで

[assembly: System.Windows.Markup.XmlnsDefinition( "http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Hoge.Fuga" )]

と書いておけばまるっとOKというお話でした。うそです、マネしちゃだめです、きっと後で苦しみます。

トラックバック - http://d.hatena.ne.jp/siokoshou/20090927

2009/9/20 (日)

[][] DataGrid に新規追加行(NewItemPlaceholder)を表示する方法  DataGrid に新規追加行(NewItemPlaceholder)を表示する方法を含むブックマーク  DataGrid に新規追加行(NewItemPlaceholder)を表示する方法のブックマークコメント

f:id:siokoshou:20090920001338j:image

WPF の DataGrid に新規追加の行(NewItemPlaceholder)が表示されなくて数日はまったので、解決方法のメモ。新規追加の行と言ってるのは、ユーザがアイテムを新たに追加するためのプレースホルダのこと。表示される場合は、デフォルトでは空の行が表示されます。かっこ悪いです。

DataGrid に渡すデータはよっぽどのことがなければ ObservableCollection<T> を使うと思いますが、この T が問題でした。この T に引数なしのコンストラクタがないといけません。

マニュアルに書いといて欲しい…。

以上。で終わるのもなんなのでサンプル。

まずはダメな例。FileInfo には引数なしのコンストラクタがないので、これを DataGrid にバインディングしても新規追加の行は表示されません。

// ダメな例。DataGridに追加のための行が表示されない
private ObservableCollection<FileInfo> dameCreateData()
{
    var fs = Directory.GetFiles( "." ).Select( s => new FileInfo( s ) );
    var data = new ObservableCollection<FileInfo>( fs );
    return data;
}

これを直して NewItemPlaceholder が表示されるようにするには、MVVM でいうところの ViewModel のようなクラス、つまり FileInfo をくるむラッパーを追加し、引数なしのコンストラクタを用意します。面倒です。やってられませんw

public class FileInfoViewModel : INotifyPropertyChanged
{
  private FileInfo fileInfo;

  // 引数なしのコンストラクタ
  public FileInfoViewModel() : this( @"C:\pagefile.sys" ) {}

  public FileInfoViewModel( string fileName )
  {
    this.fileInfo = new FileInfo( fileName );
  }

  public event PropertyChangedEventHandler PropertyChanged;

  protected virtual void OnPropertyChanged( string propertyName )
  {
    if ( this.PropertyChanged != null )
    {
      this.PropertyChanged( this, new PropertyChangedEventArgs( propertyName ) );
    }
  }

  public string Name
  {
    get { return this.fileInfo.Name; }
    set
    {
      this.fileInfo = new FileInfo( value );
      OnPropertyChanged( "Name" );
      OnPropertyChanged( "Length" );
      OnPropertyChanged( "CreationTime" );
      OnPropertyChanged( "LastAccessTime" );
    }
  }

  public long Length { get { return this.fileInfo.Length; } }

  public DateTime CreationTime
  {
    get { return this.fileInfo.CreationTime; }
    set
    {
      this.fileInfo.CreationTime = value;
      OnPropertyChanged( "CreationTime" );
    }
  }

  public DateTime LastAccessTime { get { return this.fileInfo.LastAccessTime; } }
}

超超手抜きでもこんなに長い。だるい。MVVM って本気なの?M なの?

これを使って、先のダメな例を書き直す。

private ObservableCollection<FileInfoViewModel> CreateData()
{
  var fs = Directory.GetFiles( "." ).Select( s => new FileInfoViewModel( s ) );
  var data = new ObservableCollection<FileInfoViewModel>( fs );
  return data;
}

あとは this.DataContext = CreateData(); として DataGrid に渡すだけ。

<Window x:Class="DataGridTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:tk="http://schemas.microsoft.com/wpf/2008/toolkit"
    Title="Window1" Height="300" Width="800">
    <Grid>
        <tk:DataGrid ItemsSource="{Binding}" />
    </Grid>
</Window>

これでユーザーが追加できるようになります。


WPF の DataGrid について

トラックバック - http://d.hatena.ne.jp/siokoshou/20090920

2009/9/6 (日)

[] 完成かも  完成かもを含むブックマーク  完成かものブックマークコメント

C#コンパイラチームにいた Sreekar Choudhary さんが Halo チームに移動したそうな。

C#4コンパイラができあがったのかもしれない。

http://blogs.msdn.com/sreekarc/archive/2009/09/05/joining-halo-team.aspx

それにしてもなんとまあ極端な…w

トラックバック - http://d.hatena.ne.jp/siokoshou/20090906
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 06 | 09 | 11 | 12 |
2007 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 12 |
2009 | 01 | 03 | 04 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 07 |
2011 | 04 | 07 | 10 |
2012 | 04 | 12 |
2013 | 08 |
2014 | 03 | 08 |
2017 | 09 |
Connection: close