2016-01-12 4 views
0

Я хочу заполнить datagrid itemsource = {Binding Model}. Это не работает. Кажется, что datagrid не понимает, как отображать эти свойства.Datagrid ObservableCollection для одной строки wpf

простой, но глупый обходной путь прекрасно работает:

В ViewModel:

Props= new ObservableCollection<MonitoringBinaryModel>(); 
_Model = new MonitoringBinaryModel(name); 
Props.Add(_Model); 

Тогда в XAML

itemsource={Binding Props} 

Кажется глупым, чтобы создать ObservableCollection, когда его только предположить, чтобы удерживать один элемент , Есть ли лучший способ сделать наблюдаемый экземпляр любого типа?

ответ

2

DataGrid предназначен для отображения коллекции объектов того же типа. Коллекция обязательна. Если вы хотите, чтобы DataGrid показывал контент вашей модели, вам нужно повиноваться дизайну бывшего, либо используя ObservableCollection, либо внедряя связку интерфейсов, которые позволили бы получить свойства вашей viewmodel для получения «пути сбора».

Я использовал, чтобы иметь кучу моделей, реализующих ITypedList интерфейс обратно в Windows Forms времени - это не просто упражнение, чтобы сказать правду, так что если на вашем месте я бы предпочел идти в любом случае:

  • модель Wrap в любой коллекции - точно так, как вы заявили
  • Заменить таблицу данных с контейнера сетки плюс ряд прямых привязок, например:

    <Grid> 
        <TextBlock Grid.Column="2" Grid.Row="0" Text="Prop1"/> 
    ... 
        <TextBlock Grid.Column="2" Grid.Row="1" Text="{Binding Prop1}"/> 
    
+0

Хорошо, тогда я предполагаю, что я буду продолжать использовать обходной путь. Благодаря! – Snovva1

1

Ну ItemsSource Недвижимость имеет тип IEnumarable так до тех пор, пока ваш MonitoringBinaryModel орудие IEnumerable переплет не будет работать.

Опять же, поскольку ItemsSource является IEnumerable, вы должны указать IEnumerable в качестве источника привязки. Поэтому нет необходимости делать yout Props как ObservableCollection.Вы можете использовать обычный List<>, или что-нибудь, реализующий IEnumerable с одной MonitoringBinaryModel:

_Model = new MonitoringBinaryModel(name); 
Props = new List<MonitoringBinaryModel> { _Model }; 

Другой вариант заключается в использовании CompositeCollection внутри XAML:

<DataGrid.ItemsSource> 
    <CompositeCollection> 
     <Binding Path="_Model"/> 
    </CompositeCollection> 
</DataGrid.ItemsSource> 
+0

Хорошо, спасибо, что ответили на мой вопрос! – Snovva1

+0

Без проблем, приветствия! –

0

многоразовый обертку с помощью преобразователя:

public class ItemsSourceConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     // doesn't allow to add new rows in DataGrid 
     return Enumerable.Repeat(value, 1);    
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

использование в xaml

добавить нейтрализатор РЕСУРСИ:

<Window.Resources> 
    <wpfApplication1:ItemsSourceConverter x:Key="ItemWrapper"/> 
</Window.Resources> 

и использовать конвертер ресурсосберегающим с обязательным

<DataGrid ItemsSource="{Binding Path=Model, Converter={StaticResource ItemWrapper}}" 
      AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Path=Name}"/> 
    </DataGrid.Columns> 
</DataGrid> 

или

<ItemsControl ItemsSource="{Binding Path=Model, Converter={StaticResource ItemWrapper}}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Label Content="{Binding Path=Name}"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
Смежные вопросы