2010-02-03 99 views
2

行數據以我Silverlight應用程序我已經定義與含有一個單選按鈕的模板列數據網格如下:SILVERLIGHT獲取所選在數據網格

XAML:

<data:DataGrid x:Name="Grid1" Margin="8"> 
    <data:DataGrid.Columns> 
     <data:DataGridTemplateColumn Header="RadioButtons"> 
      <data:DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <RadioButton x:Name="rdbIndataGrid" IsChecked="false" GroupName="myGroup" /> 
       </DataTemplate> 
      </data:DataGridTemplateColumn.CellTemplate> 
     </data:DataGridTemplateColumn> 
    </data:DataGrid.Columns> 
</data:DataGrid> 

C#

public MainPage() 
    { 
     // Required to initialize variables 
     InitializeComponent(); 

     string data = "1,2,3,4,5,6,7,8,9"; 

     Grid1.ItemsSource = data.Split(','); 
    } 

當點擊一個按鈕時,我希望能夠:

a)找出哪個收音機埠tton被選中。

b)從網格中與所選單選按鈕對應的其中一個單元格獲取數據。

有沒有簡單的方法來做到這一點?網格上似乎沒有行集合。或者我必須將其綁定到數據源,然後檢查數據源?

非常感謝。

回答

0

我更喜歡這樣做的方式是將IsChecked綁定到分配給ItemsSource的對象的屬性。但在這裏我會告訴你的硬盤的方式來做到這一點

編輯:其實下面是過於複雜對於這種情況,但我會離開這裏,現在,看到編輯後)

第一你需要我的VisualTreeEnumeration擴展方法之一: -

public static class VisualTreeEnumeration 
{ 

    public static IEnumerable<DependencyObject> Ancestors(this DependencyObject root) 
    { 
     DependencyObject current = VisualTreeHelper.GetParent(root); 
     while (current != null) 
     { 
      yield return current; 
      current = VisualTreeHelper.GetParent(current); 
     } 
    } 
} 

現在在我的測試中,我剛剛添加名爲lstOutput一個ListBox我的XAML。現在,添加以下兩個事件給你UserControl: -

private void rdbIndataGrid_Checked(object sender, RoutedEventArgs e) 
    { 
     DataGridRow row = ((DependencyObject)sender).Ancestors().OfType<DataGridRow>().FirstOrDefault(); 
     if (row != null) 
      lstOutput.Items.Add(String.Format("Checked: {0}", row.DataContext)); 
    } 

    private void rdbIndataGrid_Unchecked(object sender, RoutedEventArgs e) 
    { 
     DataGridRow row = ((DependencyObject)sender).Ancestors().OfType<DataGridRow>().FirstOrDefault(); 
     if (row != null) 
      lstOutput.Items.Add(String.Format("Unchecked: {0}", row.DataContext)); 
    } 

最後調整的單選按鈕XAML中,像這樣: -

<RadioButton x:Name="rdbIndataGrid" IsChecked="false" GroupName="myGroup" 
    Checked="rdbIndataGrid_Checked" Unchecked="rdbIndataGrid_Unchecked" /> 

(其中的一個巧妙的事情有關的XAML連接最多的事件是即使元素是模板的一部分,它也可以工作)。

你會注意到,在事件處理程序中,我正在從發送的RadioButton的可視樹中找到包含DataGridRow的內容。 DataGridRow是其DataContext設置爲由該行呈現的對象的對象。在您自己的代碼中,您可以將數據上下文值轉換爲正確的類型,並從那裏訪問有關該行的其他數據。

編輯

其實在大多數一般情況下,你不需要追捕擁有DataGridRow對象訪問發送RadioButtonDataContext屬性是足夠了: -

private void rdbIndataGrid_Checked(object sender, RoutedEventArgs e) 
    { 
     object myData = ((FrameworkElement)sender).DataContext; 

     if (myData != null) 
      lstOutput.Items.Add(String.Format("Checked: {0}", myData)); 
    } 

    private void rdbIndataGrid_Unchecked(object sender, RoutedEventArgs e) 
    { 
     object myData = ((FrameworkElement)sender).DataContext; 
     if (myData != null) 
      lstOutput.Items.Add(String.Format("Unchecked: {0}", myData)); 
    } 

因此,你可以免除Ancestors擴展方法。但是在更復雜的情況下,DataContext已被更改,可能需要原來的「過度複雜」方法。

相關問題