1. Silverlightには標準ライブラリにGroupBoxがない。

    フリーのGroupBoxライブラリを手に入れるか自分で作る

  2. SilverlightではDataContextに設定するオブジェクトはpublicクラスじゃないとプロパティが読めない。

    WPFではpublicクラスじゃなくてもプロパティが読める。

  3. Silverlightでは子ウィンドウで DialogResultへの設定とClose()の呼び出しを同時に行うと親ウィンドウが非活性のままになる。

    DialogResultプロパティに値を設定すると、暗黙的にClose()が呼び出される。だから、DialogResultプロパティに値を設定する場合はClose()を呼んではいけない。
    WPFでは問題なく動く。

  4. SilverlightではWCFサービスは非同期呼び出ししかできない。

    WPFからの場合はWCFサービスの呼び出し方法に制限はない。Silverlightでは非同期のHTTP呼び出しに限定される。
    すべての呼び出しを同期呼び出しから非同期呼び出しに変えるのは結構手間。

  5. Silverlightでは子ウィンドウの呼び出しは非同期になる。

    WPFではShowDialog()してからDialogResultを読みにいけるが、Silverlightでは非同期であるため子ウィンドウが閉じたあとの処理はClosedイベントに登録しなければならない。

  6. SilverlightからWCFを呼ぶときにはエラー処理のための設定が必要になる。

    http://msdn.microsoft.com/ja-jp/library/dd470096(v=vs.95).aspx

    例外を投げるとHTTP500になるらしいのだけれど、SilverlightはHTTP500を検出するとCommunicationExceptionになってしまう。
    上記ページにしたがってWCFで例外を投げるときのHTTPステータスを変更してやる必要がある。

1. MVVMパターン
WPFやSilverlightではMVVMパターンというものを使うとわりと綺麗になるみたい。

http://msdn.microsoft.com/ja-jp/magazine/dd419663.aspx

View: Xamlとpartialクラス
ViewModel : ViewのDataContextに設定する
Model: ビジネスロジック

2. チェックボックス付きリストボックスなどのバインディング
下記のようなクラスをつくってコレクションをバインドすればいい。

class MyCheckBoxItem : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    public bool _IsChecked;
    public bool IsChecked { get { return _IsChecked; } set { _IsChecked = value; NotifyPropertyChanged("IsChecked"); }
    public MyData ItemData { get; set; }
}

3. 他のコントロールのプロパティを参照してコントロールのプロパティを設定する。
下記はテキストボックスが空でないときだけボタンを有効にする。
PositiveNumberToTrueConverterは正の数であればtrueを返すコンバータとする。

<TextBox x:Name="MyTextBox"/>
<Button Content="ぼたん" IsEnabled="{Binding ElementName=MyTextBox, Path=Text.Length, Converter={StaticResource PositiveNumberToTrueConverter}}"/>