3

正しく動作している Silverlight 4 のユーザー コントロールで、データ グリッドの列を動的に作成しています。データ グリッドの最初の列はボタンなので、次のコードを使用して DataGrid の DataTemplate を追加しています。

DataGridTemplateColumn templateColumn = new DataGridTemplateColumn();
templateColumn.Header = "Search";
StringBuilder sb = new StringBuilder(); 
sb.Append("<DataTemplate ");
sb.Append("xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' ");
sb.Append("xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>");
sb.Append("<Button Name='searchBtn' Width='25' Height='20' Click='performFastSearch' >");
sb.Append("<Image Source='http://localhost/SiteAssets/img/Homepage/ribbon_top_right.png'  Stretch='None' />");
sb.Append("</Button>");
sb.Append("</DataTemplate>");

templateColumn.CellTemplate = (DataTemplate)XamlReader.Load(sb.ToString());

Click="performFastSearch" の部分を省略してもコードは機能しますが、追加すると「crossappdomainmarshaledexception」で壊れます。

これは、クリックハンドラーメソッドを追加しようとする方法ですか、それとも別のものを使用する必要がありますか?

4

1 に答える 1

4

Click イベントの名前付きメソッドを指定する使用している XAML 構文は、XAML がユーザー コントロール内で定義されている場合にのみ機能します。このコンテキストでは、Visual Studio によって生成されたコードがクリック ハンドラーを自動的に関連付けます。コードで XAML を作成しているため、生成時にこのボタンを見つけて、自分でクリック ハンドラーを接続する必要があります。

各行がレンダリングされると、loading イベントを処理して Button を見つけ、接続します。このブログ投稿はあなたを助けるかもしれません:

    void grid_LoadingRow(object sender, DataGridRowEventArgs e) 
    { 
        var btnCol =  
        m_DataGrid.Columns.FirstOrDefault(
                c => c.GetValue(FrameworkElement.NameProperty) as string == "m_BtnColumn");

        FrameworkElement el = btnCol.GetCellContent(e.Row);

        Button btn = el as Button;

        if (btn != null) 
        {    
            btn.Click -= new RoutedEventHandler(btn_Click); 
            btn.Click += new RoutedEventHandler(btn_Click); 
        } 
    }


    void btn_Click(object sender, RoutedEventArgs e) 
    { 

    }
于 2012-05-15T14:37:46.617 に答える