2015-09-16 5 views
1

У меня возникли некоторые проблемы с привязкой данных к Combobox внутри DataGrid в WPF XAML.GridView Combobox DataBinding WPF

У меня есть класс сигнала, который имеет ObservableCollection.

public struct RawVal 
{ 
    public string name; //Name of the Value 
    public int value; // Value 
} 


public class Signal 
{ 
    public string Name { get; set; } 
    public Int32 Value { get; set; } 
    public ObservableCollection<RawVal> rawValue { get; set; } 
}; 

И в окне Stettings есть

public partial class Settings : Window 
{  
    public ObservableCollection<Signal> tempSigList { get; set; } 
    public ObservableCollection<RawVal> tempRawVal { get; set; } 
    ......... 
    ......... 
this.grdSignal.ItemsSource = tempSigList; 

}

И мой XAML выглядит следующим образом:

<DataGrid ItemsSource="{Binding}" Name="grdSignal"> 
<DataGrid.Columns>  
    <DataGridTemplateColumn Header=" RAW Value "> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <ComboBox ItemsSource="{Binding tempRawVal }" SelectedItem="Binding name" /> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

Но нет никаких результатов ㅠㅠㅠ Я перепробовал много примеров на stackoverflow, но никаких результатов нет. Любые предложения или решения приветствуются. Спасибо

+0

Спасибо, братья. Кажется, есть и другая проблема. Комбобокс в других проектах также не показывает какой-либо элемент. Он опускается, но ничего не происходит. Я использую .NET Framework 4. – Mamurbek

ответ

0

Здесь:

Окно:

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    tempSigList = new ObservableCollection<Signal>(); 
    tempSigList.Add(new Signal { Name = "Name 1", Value = 1, rawValue = new ObservableCollection<RawVal> { new RawVal { name = "combo 1", value = 1 }, new RawVal { name = "combo 2", value = 2 } } }); 
    tempSigList.Add(new Signal { Name = "Name 2", Value = 2, rawValue = new ObservableCollection<RawVal> { new RawVal { name = "combo 3", value = 3 }, new RawVal { name = "combo 4", value = 4 } } }); 
    tempSigList.Add(new Signal { Name = "Name 3", Value = 3, rawValue = new ObservableCollection<RawVal> { new RawVal { name = "combo 5", value = 5 }, new RawVal { name = "combo 6", value = 6 } } }); 
    tempSigList.Add(new Signal { Name = "Name 4", Value = 4, rawValue = new ObservableCollection<RawVal> { new RawVal { name = "combo 7", value = 7 }, new RawVal { name = "combo 8", value = 8 } } }); 
    tempSigList.Add(new Signal { Name = "Name 5", Value = 5, rawValue = new ObservableCollection<RawVal> { new RawVal { name = "combo 9", value = 9 }, new RawVal { name = "combo 10", value = 10 } } }); 

    dataGrid1.ItemsSource = tempSigList; 
} 

XAML:

<DataGrid x:Name="dataGrid1" ItemsSource="{Binding}"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="RAW Value"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ComboBox ItemsSource="{Binding rawValue}" SelectedItem="{Binding name}" DisplayMemberPath="name" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

enter image description here

Я использовал AutoGenerateColumns=true. Вы можете сделать это false и у вас есть только ваш столбец ComboBox.

enter image description here

+0

Спасибо, Bro, он работал хорошо. Проблема была в публичной структуре. Члены RawVal не имели getter и setter. – Mamurbek

+0

Да, я использовал класс с публичной недвижимостью и в конце концов забыл рассказать вам об этом ...: O) – jsanalytics

+0

Большое спасибо, сэр! – jsanalytics

0

Прежде всего, переплетные работы со свойствами и не поля, как в классе RawVal.

Показаны данные, используя 3 колонки, как они должны быть:

public partial class Win32599087 : Window 
    { 
     public ObservableCollection<Signal> tempSigList { get; set; } 
     public ObservableCollection<RawVal> tempRawVal { get; set; } 

     public Win32599087() 
     { 
      InitializeComponent(); 

      tempRawVal = new ObservableCollection<RawVal>() { 
       new RawVal(){ Name="RawName1", Value=1}, 
       new RawVal(){ Name="RawName2", Value=2}, 
       new RawVal(){ Name="RawName3", Value=3}, 
       new RawVal(){ Name="RawName4", Value=4} 

      }; 

      tempSigList = new ObservableCollection<Signal>() {    
       new Signal(){Name="signal1", Value = 1, RawValues = tempRawVal} 
      }; 

      SignalGrid.DataContext = tempSigList; 
     } 
    } 

//////////////

<DataGrid x:Name="SignalGrid" AutoGenerateColumns="False" SelectedIndex="0" ItemsSource="{Binding}"> 
     <DataGrid.Columns>     

      <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
      <DataGridTextColumn Header="Value" Binding="{Binding Value}"/> 
      <DataGridComboBoxColumn Header="RawValues"> 
      <DataGridComboBoxColumn.EditingElementStyle> 
       <Style TargetType="ComboBox"> 
        <Setter Property="ItemsSource" Value="{Binding Path=RawValues}" /> 
        <Setter Property="DisplayMemberPath" Value="Name" /> 
        <Setter Property="SelectedValuePath" Value="Value" /> 
       </Style> 
       </DataGridComboBoxColumn.EditingElementStyle> 
      </DataGridComboBoxColumn> 

     </DataGrid.Columns> 
    </DataGrid> 

/////// С шаблоном column:

<DataGrid x:Name="SignalGridWithTemplates" AutoGenerateColumns="False" SelectedIndex="0" ItemsSource="{Binding}"> 
      <DataGrid.Columns> 

       <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
       <DataGridTextColumn Header="Value" Binding="{Binding Value}"/> 
       <DataGridTemplateColumn Header="RawValues"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <StackPanel> 
           <ComboBox ItemsSource="{Binding RawValues}"> 
            <ComboBox.ItemTemplate> 
             <DataTemplate> 
              <StackPanel Orientation="Horizontal"> 
               <TextBlock Text="{Binding Name}" Background="AliceBlue"/> 
               <TextBlock Text=" | "/> 
               <TextBlock Text="{Binding Value}" Background="Azure"/> 
              </StackPanel> 
             </DataTemplate> 
            </ComboBox.ItemTemplate> 
           </ComboBox> 
          </StackPanel> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 

      </DataGrid.Columns> 
     </DataGrid> 
+0

Прочтите эту запись в блоге: [Макет DataGrid] (http://blogs.msdn.com/b/vinsibal/archive/2008/08/14/wpf-datagrid-dissecting-the-visual-layout.aspx) – AnjumSKhan

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