C# WPF - DataGrid column template - bindowanie danych

0

Cześć.

Z WPF mam do czynienia od niedawna, dopiero się uczę. Napotkałem pewien problem i chciałbym Was poprosić o pomoc.

Załóżmy, że mam listę obiektów w kolekcji i chciałbym je wyświetlić w Datagrid:

    public class TargetOS
    {
        public bool Select { get; set; }

        public string Name { get; set; }
    }

    private ObservableCollection<TargetOS> targetOSList;

    public ObservableCollection<TargetOS> TargetOSList
    {
        get
        {
             return targetOSList;
        }
        set
        {
             targetOSList = value;

             OnPropertyChanged("TargetOSList");
        }
    }

Z prostym wyświetleniem zawartości kolekcji w DataGrid nie mam problemu, robię to w ten sposób:

 
<DataGrid Grid.Row="6" Grid.Column="1" ItemsSource="{Binding Path=TargetOSList}" VerticalAlignment="Top" BorderThickness="0" ColumnWidth="*"></DataGrid>                                

Binduje ItemSource z kolekcją i wszystko jest w porządku - dla property typu bool w datagrid pojawia się checkbox.

Teraz chciałbym zdefiniować template dla kolumny w DataGrid tak aby móc ustawić szerokość danej kolumny, ale co najważniejsze w definicji template-u chiałbym się odnosić do poszczególnych property obiektów z kolekcji (Select oraz Name z klasy TargetOS).

Coś mniej lub bardziej podobne do tego rozwiązania:

 
<DataGrid Grid.Row="6" Grid.Column="1" ItemsSource="{Binding Path=TargetOSList}" VerticalAlignment="Top" BorderThickness="0" ColumnWidth="*">
	<DataGrid.Columns>
		<DataGridTextColumn Header="Name" Binding="{Binding Path=Name}"/>

		<DataGridTemplateColumn Header="Select">
			<DataGridTemplateColumn.CellTemplate>
				<DataTemplate>
					<CheckBox IsChecked="{Binding Path=Select}" />
				</DataTemplate>
			</DataGridTemplateColumn.CellTemplate>
		</DataGridTemplateColumn>
	</DataGrid.Columns>
</DataGrid>

Pytanie brzmi, czy w definicji template-u dla kolumn, tam gdzie binduje dane mogę w jakiś sposób odnieść się do property obiektów z kolekcji wskazanej w ItemsSource?

Takie odwołanie nie działa:

Binding Path=TargetOSList.Name
Binding Path=TargetOSList.Select

i wcale mnie to nie dziwi, ale chciałem Wam dać obraz tego co chce uzyskać.

Druga sprawa. Gdy definiuje tempalte dla DataGrid i jednocześnie wskazuje kolekcję w ItemSource to wówczas otrzymuje cztery kolmny zamiast dwóch (Select oraz Name) - wyświetla zarówno nazwy property z klasy TargetOS jak i nazwy kolumn zdefiniowanych w template.

Czy w jakiś spobób mogę osiągnąć to co opisałem powyżej?

Pozdrawiam.

0

Do dostępu do innych elementów niż ten w danym wierszu będzie potrzebny konwerter, który przyjmuje całą kolekcję tak jak ItemsSource, po czym coś tam z niej wyciąga i przetwarza, żeby wypluć coś innego, zależnie od Twoich potrzeb: http://www.wpftutorial.net/ValueConverters.html

0
Herk napisał(a):
    public class TargetOS
    {
        public bool Select { get; set; }

        public string Name { get; set; }
    }

"Select" to się nadaje na nazwe metody, propertis powinien się nazywać IsSelected.

Herk napisał(a):
 
<DataGrid Grid.Row="6" Grid.Column="1" ItemsSource="{Binding Path=TargetOSList}" VerticalAlignment="Top" BorderThickness="0" ColumnWidth="*">
	<DataGrid.Columns>
		<DataGridTextColumn Header="Name" Binding="{Binding Path=Name}"/>

		<DataGridTemplateColumn Header="Select">
			<DataGridTemplateColumn.CellTemplate>
				<DataTemplate>
					<CheckBox IsChecked="{Binding Path=Select}" />
				</DataTemplate>
			</DataGridTemplateColumn.CellTemplate>
		</DataGridTemplateColumn>
	</DataGrid.Columns>
</DataGrid>

Pytanie brzmi, czy w definicji template-u dla kolumn, tam gdzie binduje dane mogę w jakiś sposób odnieść się do property obiektów z kolekcji wskazanej w ItemsSource?

.

Nie rozumiem pytania, kod który przytoczyłeś dokładnie to robi, wyświetla properta z obiektu dla aktualnego wiersza.

Herk napisał(a):

Druga sprawa. Gdy definiuje tempalte dla DataGrid i jednocześnie wskazuje kolekcję w ItemSource to wówczas otrzymuje cztery kolmny zamiast dwóch (Select oraz Name) - wyświetla zarówno nazwy property z klasy TargetOS jak i nazwy kolumn zdefiniowanych w template.

ustaw dla DataGrid properta AutoGenerateColumns = "false"

1 użytkowników online, w tym zalogowanych: 0, gości: 1