Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Binding SelectedIteems 
:(
    Опции темы
Stratus
Дата 25.6.2013, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 27.5.2009

Репутация: нет
Всего: нет



Коллеги, подскажите плиз

Задача очень простая но решить не могу....

Есть 2 грида, при выборе в первом гриде строк, эти строки должны отображаться во втором гриде.
В таком виде задача решается просто, однако мне нужно чтобы во вором гриде отображались только определенные столбцы. 
Иными словами нужно сделать биндинг не всех столбцов первого грида а только нужых. 
Как это сделать?


Код

class DataObject
{
    string _FirstField;
    string _SecondField;

    public DataObject(string firstField, string secondField)
    {
        _FirstField = firstField;
        _SecondField = secondField;
    }

    public string FirstField
    { get { return _FirstField; } set { _FirstField = value; } }

     public string SecondField
     { get { return _SecondField; } set { _SecondField = value; } }
}



Код

class Collection : ObservableCollection<DataObject> {}


Код

        public MainWindow()
        {
            InitializeComponent();
            //Добавляем значения в коллецию уже созданную в XAML
            NS.Collection coll = (NS.Collection)this.FindResource("DataCollection");

            coll.Add(new NS.DataObject("value1", "value2"));
            coll.Add(new NS.DataObject("value3", "value4"));
        }


Код

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit" 
        xmlns:data="clr-namespace:clrnamespace.NS"
        x:Class="clrnamespace.MainWindow"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <data:Collection x:Key="DataCollection"/>
        <CollectionViewSource x:Key="cvs" Source="{StaticResource ResourceKey=DataCollection}" />
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="268*"/>
            <ColumnDefinition Width="249*"/>
        </Grid.ColumnDefinitions>
        <toolkit:DataGrid x:Name="dataGrid" Margin="10,10,8,10" ItemsSource="{Binding Mode=OneWay, Source={StaticResource cvs}}" AutoGenerateColumns="False">
            <toolkit:DataGrid.Columns>
                <toolkit:DataGridTextColumn Binding="{Binding FirstField}" Header="Поле 1"/>
                <toolkit:DataGridTextColumn Binding="{Binding SecondField}" Header="Поле 2"/>
            </toolkit:DataGrid.Columns>
        </toolkit:DataGrid>
        <toolkit:DataGrid Margin="11,10,10,10" Grid.Column="1" ItemsSource="{Binding SelectedItems, ElementName=dataGrid}"/>
    </Grid>
</Window>


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  SelectedIteems_Binding.zip 559,28 Kb
PM MAIL   Вверх
dzaraev
Дата 27.6.2013, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: нет
Всего: 1



Первый и самый простой способ, это явно указать во втором гриде нужные колонки (выключив при этом автогенерацию):
Код

<toolkit:DataGrid 
       Margin="11,10,10,10" 
       Grid.Column="1"
       AutoGenerateColumns="False"
       ItemsSource="{Binding SelectedItems, ElementName=dataGrid}">
       <toolkit:DataGrid.Columns>
           <toolkit:DataGridTextColumn Binding="{Binding SecondField}" Header="Поле 2"/>
       </toolkit:DataGrid.Columns>
</toolkit:DataGrid>

При этом, чтобы не дублировать значения  типа Header="Поле 2" и т.п., лучше забиндить их у первой и у второй таблицы на один ресурс.

Второй вариант - сделать программно, но здесь есть одна проблема, нельзя добавить в DataGrid экземпляр DataGridColumn из другого грида, будет исключение, ибо
Цитата

DataGrids cannot share columns and cannot contain duplicate column instances.

Поэтому в этом варианте придется создавать новые колонки, и настраивать соответственно колонкам из первого грида, а это, в свою очередь, проще сделать в XAML, т.е. первым способом.

Третий вариант - тоже программный. Можно влиять на автогенерируемые столбцы, с помощью обработки события DataGrid.AutoGeneratingColumn. В этом случае можно, например, отменить создание определённой колонки. Таким образом, указав где-нибудь список необходимых колонок(полей элемента), можно отменять все остальные колонки в этом событии. На случай, если вдруг понадобится применить к таким (автогенереным) столбцам свой DataTemplate вот полезный пример.

P.S. Кстати, если есть возможность, советую перевести проект на .NET 4.0, там DataGrid уже включен в сам фреймворк и тулкит не нужен.

Это сообщение отредактировал(а) dzaraev - 28.6.2013, 15:15
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
Stratus
  Дата 17.7.2013, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 27.5.2009

Репутация: нет
Всего: нет



dzaraev,  Спасибо большое за развернутый ответ.

У меня получилось, но что-то сразу до этого догадаться ума не хватило.
PM MAIL   Вверх
dzaraev
Дата 18.7.2013, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: нет
Всего: 1



В таком случае прошу пометить вопрос, как решённый smile 
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0991 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.