Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Binding SelectedIteems


Автор: Stratus 25.6.2013, 16:29
Коллеги, подскажите плиз

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

Есть 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>

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

<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, т.е. первым способом.

Третий вариант - тоже программный. Можно влиять на автогенерируемые столбцы, с помощью обработки события http://msdn.microsoft.com/ru-ru/library/system.windows.controls.datagrid.autogeneratingcolumn(v=vs.100).aspx. В этом случае можно, например, отменить создание определённой колонки. Таким образом, указав где-нибудь список необходимых колонок(полей элемента), можно отменять все остальные колонки в этом событии. На случай, если вдруг понадобится применить к таким (автогенереным) столбцам свой DataTemplate http://www.codeproject.com/Articles/43525/WPF-DataGrid-Using-DataTemplates-for-auto-generate.

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

Автор: Stratus 17.7.2013, 22:12
dzaraev,  Спасибо большое за развернутый ответ.

У меня получилось, но что-то сразу до этого догадаться ума не хватило.

Автор: dzaraev 18.7.2013, 06:57
В таком случае прошу пометить вопрос, как решённый smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)