2013-04-30 2 views
2

У меня есть класс устройств с платформы в качестве одного из свойств:DataGridComboBoxColumn связывание с ObservableCollection

public partial class DevicesCollection : ObservableCollection<Device> 
{ 
    public DevicesCollection() : base() 
    { } 
} 

public partial class Device : INotifyPropertyChanged 
{ 
    private string hostIP; 
    private string password; 
    private int platform; 
    private string status = ""; 
    private int loop = 1; 

    public Device() { } 

    public Device(string ip, string pswd, int tp) 
    { 
     HostIP = ip; 
     Password = pswd; 
     Platform = tp; 
     Status = "Disconnected"; 
     Loop = 1; 
    }   

Как и у меня есть класс Платформа:

public partial class PlatformsCollection : ObservableCollection<Platform> 
{ 
    public PlatformsCollection() 
     : base() 
    { 
     Add(new Platform(1, "iOS")); 
     Add(new Platform(2, "Android")); 
     Add(new Platform(3, "Windows")); 
     Add(new Platform(4, "Blackberry")); 
    } 
} 

public partial class Platform : INotifyPropertyChanged 
{ 
    private string platformName; 
    private int platformId; 

    public Platform(int id, string name) 
    { 
     PlatformName = name; 
     PlatformId = id; 
    } 
.... 

У меня есть DataGrid, который связан с Класс устройств и один из столбцов - это Платформа, которую я пытаюсь связать с классом платформы:

<DataGridComboBoxColumn x:Name="platform" Header="Platform" CanUserResize="False" 
         ItemsSource="{Binding Platform}" 
         SelectedValueBinding="{Binding Path=Platform.PlatformId}" 
         SelectedValuePath="PlatformId" 
         DisplayMemberPath="PlatformName" Width="100"> 
    <DataGridComboBoxColumn.ElementStyle> 
     <Style TargetType="ComboBox"> 
      <Setter Property="ItemsSource" Value="{Binding Path=Platform.PlatformName}" /> 
     </Style> 
    </DataGridComboBoxColumn.ElementStyle> 
</DataGridComboBoxColumn> 

Я вижу dropbox со значениями, но после выбора любого значения при попытке получить столбец DataGrid.ItemsSource Платформа пуста. Что я делаю неправильно? Я попытался изменить столбец на шаблон с помощью combobox внутри - тот же результат. Я буду признателен за любую помощь или, по крайней мере, направление окопаться.

+0

У меня нет большого опыта работы с 'DataGridComboBoxColumn', но' ItemsSource' должен быть привязан к набору платформ, а не к единственной выбранной платформе устройства. Также см. Эти вопросы для некоторых известных предостережений: [Binding DataGridComboBoxColumn] (http://stackoverflow.com/questions/16303114/binding-datagridcomboboxcolumn) и [Как привязать коллекцию к WPF: DataGridComboBoxColumn] (http: // stackoverflow. com/questions/2890156/how-to-bind-collection-to-wpfdatagridcomboboxcolumn) – Sphinxxx

ответ

0

Вы пытаетесь, чтобы связать DataGridComboBoxColumn «S ItemsSource свойства к ObservableCollection (PlatformsCollection) или в собственность (Platform)?

Вы должны быть в состоянии сделать это с чем-то вроде ..

<DataGridComboBoxColumn Header="Platform" ItemsSource="{Binding PlatformsCollection}" 
    SelectedValue="{Binding SelectedPlatform}" DisplayMemberPath="PlatformName"/> 

Вам нужно добавить еще один элемент в вашей модели под названием SelectedPlatform, которая будет хранить/обновлять каждый раз, когда пользователь изменяет выбранную платформу ,

Кроме того, вы можете посмотреть в использовании комбинации CellTemplate/CellEditingTemplate с DataGridTemplateColumn для этого, который выглядит немного лучше. Пользователь представлен только текстовым полем, если они не щелкнут по ячейке, в этот момент появится поле со списком.

Разметка для этого было бы что-то вроде

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding SelectedPlatform.PlatformName}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <ComboBox ItemsSource="{Binding PlatformsCollection}" 
       SelectedValue="{Binding SelectedPlatform}" 
       DisplayMemberPath="PlatformName"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn 

Хотелось бы надеяться, что помогает. Дайте знать, если у вас появятся вопросы.

+0

Вы правы - я попытался связать свойство (Platfrom) - привязка к PlatformsCollection - это недавнее изменение - когда я понял, что привязка к Platform doesn ' т работы. Выбранная платформа должна быть классной, как платформа? Я appologise, если вопросы глупы - я довольно новичок в WPF и в .NET-разработке - все это я разработчик PHP, которому нужна помощь :) Что касается CellTemplate - это выглядит действительно элегантным решением , но я должен использовать этот столбец в доступе к существующему столбцу combobox или вместо? –

+0

Честно говоря, мне не нужно использовать платформу как класс - все, что мне нужно, это обеспечить платформу для устройства из списка из 4 элементов. Существует ли какой-либо способ создать его без всех этих трюков - какой-то жестко запрограммированный список элементов, который генерирует выпадающее поле со списком? –

+0

О, получилось. Да, вы можете просто добавить платформу сложного типа в свой класс устройства и установить атрибут SelectedValue в поле со списком, равное Device.Platform. – Justin

0

Если ваши платформы являются общими для всех объектов, то вы можете сделать платформы свойства статическим и ваш XAML будет использовать его, как это показано ниже:

<DataGridComboBoxColumn 
    Header="Role" 
    SelectedValueBinding="{Binding Role}" 
    ItemsSource="{Binding Source={x:Static local:ProjectsDataContext.Roles}}" 
    DisplayMemberPath="Name"/> 

Будет надеяться, что это поможет.