2013-03-11 1 views
4

Я установил свой ListBoxItem для Listbox, который вложен в datagrid. Тем не менее, когда я попытался выполнить цикл через datagrid, чтобы найти элемент управления для списка, но он не удался, когда я попытался получить значение того, какой переключатель выбран.Не удалось прочитать вложенное настроенное значение Listbox в Datagrid WPF

Кто угодно, пожалуйста, совет по любому подходу или фрагменту решения, которое может помочь? Большое спасибо.

<Page.Resources> 
    <Style x:Key="RadioButtonItemStyle" TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="Margin" Value="0,0,5,0" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <Border BorderThickness="0" Background="Transparent"> 
         <!-- Note: IsChecked is bound to IsSelected--> 
         <RadioButton 
        Focusable="False" 
        IsHitTestVisible="False" 
        IsChecked="{TemplateBinding IsSelected}"> 
          <ContentPresenter /> 
         </RadioButton> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
    <ItemsPanelTemplate x:Key="HorizontalItemsPanel"> 
     <VirtualizingStackPanel 
    Orientation="Horizontal" /> 
    </ItemsPanelTemplate> 
</Page.Resources> 
<Grid> 
    <StackPanel> 
     <StackPanel Orientation="Horizontal"> 
      <Label Name="GroupQuestionHeader" FontSize="14" FontWeight="Bold" FontFamily="Times New Roman" /> 
      <Label Name="PageCount" FontSize="10" FontFamily="Times New Roman"></Label> 
     </StackPanel> 

     <DataGrid AutoGenerateColumns="False" HorizontalAlignment="Left" Name="dataGrid1" VerticalAlignment="Top" CanUserReorderColumns="False" CanUserSortColumns="False" CanUserResizeColumns="False" CanUserAddRows="False"> 
      <DataGrid.CellStyle> 
       <Style TargetType="DataGridCell"> 
        <Setter Property="Padding" Value="5" /> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type DataGridCell}"> 
           <Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"> 
            <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
           </Border> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
        <Style.Triggers> 
         <Trigger Property="IsSelected" Value="true"> 
          <Setter Property="Background" Value="Transparent" /> 
          <Setter Property="Foreground" Value="Black" /> 
          <Setter Property="BorderBrush" Value="{x:Null}" /> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </DataGrid.CellStyle> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="Question" Width="400"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock TextWrapping="Wrap" Text="{Binding QuestionContent, Mode=OneWay}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTemplateColumn Header="We fully Comply | We partly Comply | We do not Comply" Width="*"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <ListBox 
          BorderThickness="0" 
          SelectedValue="{Binding MyDataListSelectedValue}" 
          ItemContainerStyle="{StaticResource RadioButtonItemStyle}" 
          ItemsPanel="{StaticResource HorizontalItemsPanel}" Name="OptionsRadioButtonGroup" HorizontalContentAlignment="Left" 
           Cursor="Hand" HorizontalAlignment="Left"> 
           <ListBoxItem Width="90"/> 
           <ListBoxItem Width="90"/> 
           <ListBoxItem/> 
          </ListBox> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
     <Button Content="Next Page" Height="23" HorizontalAlignment="Right" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
    </StackPanel> 
</Grid> 

метод я использовал

for (int i=0;i<dataGrid1.Items.Count;i++) 
{ 
    DataRowView datarowv = (DataRowView)dataGrid1.Items[i]; 
    DataRow dr = datarowv.Row; 
    string RBValue = dr.ItemArray[1].toString(); 
} 
+0

Как вы пытаетесь получить значения_ переключателей? – DHN

ответ

1

Как об этом. Я не скомпилировал код, который я только что написал прямо из головы. Извините, если вы получите ошибки компиляции. Просто исправьте их.

for (int i=0;i<dataGrid1.Items.Count;i++) 
{ 

    // get control which represents the data 
    var control = dataGrid1.ItemContainerGenerator.ContainerFromItem(dataGrid1.Items[i]); 
    DependencyObject obj = control 

    // inside that control there is somewhere the ListBox so run down the visualtree till you find the damn ListBox 
    for(;!(obj is ListBox); 
     obj = VisualTreeHelper.GetChild(obj, 0)); 

    ListBox listBox = obj as ListBox; 
    if(listBox != null) 
    { 
     // get the selected values from ListBox 
     var selectedItems = listBox.SelectedItems; 
     foreach(var selectedItem in selecteditems) 
     { 
     Console.WriteLine("I am a selected item: " + selectedItem.ToString()); 
     } 
    } 
} 

Если вы не понимаете, что делает этот небольшой код, просто спросите.

+0

Привет, мой герой, спасибо за ваш ответ.
** var control = ItemsControl.ContainerFromElement (dataGrid1, dataGrid1.Items [i]); **
строка выше выдает ошибку, когда я пытался скомпилировать. Я попытался передать его DataGridRow как «DataGridRow» dataGrid1.Items [i] ', хотя VS не имеет ошибки компиляции, но когда я попытался получить значение, VS выбрасывает и исключает ** Невозможно использовать объект типа 'POCSurveySystem.Business.Entities.Question' для типа 'System.Windows.Controls.DataGridRow'. ** Извините, что я новичок в WPF, и ваша помощь высоко ценится. –

+0

Привет, я не уверен, о чем вы говорите. Но посмотрите на MSDN: http: //msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.containerfromelement.aspx ContainerFromElement возвращает контейнер, принадлежащий текущему элементу ItemsControl, которому принадлежит данный элемент. –

+0

Если у кого-то есть какой-либо другой подход, пожалуйста, поделитесь со мной светом. Я продолжу свои усилия, чтобы сделать рекомендацию ежиком работать тем временем (в настоящее время не удается скомпилировать, хотя) Спасибо. –

Смежные вопросы