1

各TabItemにDatagridが含まれ、データバインドされたデータバインドされたTabcontrolを作成しようとしています。

私のデータ構造は次のようなものです:

    public class Exercise
{
    public Guid ExerciseID { get; protected set; }
    public string ExerciseName { get; set; }
    public List<Set> Sets { get; set; }
}

    public class Set
{
    public Guid SetID { get; protected set; }
    public decimal Weight { get; set; }
    public decimal Reps { get; set; }
    public bool MaxEffort { get; set; }
}

List<Exercise>をTabControlにバインドし、 List<Set>for each Exercise を各タブ内の DataGrid にバインドして、「Weight」および「Reps」プロパティを 2 列に表示しようとしています。私の現在の XAML コードは以下のとおりで、関連するセクションにラベルが付けられています。

<Window x:Class="MyWorkouts.WorkoutViewer"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WorkoutViewer" Height="424" Width="708"
    x:Name="WorkoutDisplay">
<Grid DataContext="{DynamicResource WorkoutToDisplay}">
    <Calendar SelectedDate="{Binding WorkoutDate}" Height="180" HorizontalAlignment="Left" Margin="8,12,0,0" Name="calendar1" VerticalAlignment="Top" Width="230" />
    <StackPanel Height="94" HorizontalAlignment="Left" Margin="12,182,0,0" Name="spProperties" VerticalAlignment="Top" Width="238">
        <StackPanel Height="30" Name="spProgram" Width="232" Orientation="Horizontal">
            <Label Content="Workout Program:" Height="25" Name="lblProgram" Width="104" />
            <TextBox Text="{Binding WorkoutProgram}" Height="25" Name="tbProgram" Width="120" />
        </StackPanel>
        <StackPanel Height="30" Name="spType" Width="232" Orientation="Horizontal">
            <Label Content="Workout Type:" Height="25" Name="lblWorkoutType" Width="104" />
            <TextBox Text="{Binding WorkoutType}" Height="25" Name="tbWorkoutType" Width="120" />
        </StackPanel>
        <StackPanel Height="30" Name="spVenue" Width="232" Orientation="Horizontal">
            <Label Content="Workout Venue:" Height="25" Name="lblVenue" Width="104" />
            <TextBox Text="{Binding WorkoutVenue}" Height="25" Name="tbVenue" Width="120" />
        </StackPanel>
    </StackPanel>

    <TabControl Height="365" HorizontalAlignment="Left" Margin="260,10,0,0" Name="TCWorkoutView" VerticalAlignment="Top" Width="425">
        <TabItem Header="Workout View" Name="TIView">
            <StackPanel Height="335" HorizontalAlignment="Left" Name="spExercises" VerticalAlignment="Top" Width="410" Grid.ColumnSpan="2">
                <ItemsControl ItemsSource="{Binding Exercises}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Expander Header="{Binding ExerciseName}" BorderThickness="1" BorderBrush="DarkBlue">
                                <ItemsControl ItemsSource="{Binding Sets}" DisplayMemberPath="WeightForReps" BorderThickness="1" BorderBrush="Gray"/>
                            </Expander>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
        </TabItem>
        <!--The below section is the one in question-->
        <TabItem Header="Edit Workout">
            <TabControl ItemsSource="{Binding Path=Exercises}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <DataGrid ItemsSource="{Binding Path=Sets}" AutoGenerateColumns="False">
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="Weight" Binding="{Binding Path=Weight}"/>
                                <DataGridTextColumn Header="Reps" Binding="{Binding Path=Reps}"/>
                            </DataGrid.Columns>
                        </DataGrid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </TabControl>
        </TabItem>
    </TabControl>
</Grid>

各タブに ExerciseName プロパティを正しく表示することはできます (正しい数のタブが生成されますが、データグリッドはまったくありません。代わりに、タブには MyWorkouts.Exercise とだけ表示されます (MyWorkouts は名前空間です)。

ちょっとした背景として、これはワークアウト ログ プログラムの「編集」画面を意図しており、エキスパンダーのスタックパネルで正しく動作するディスプレイ ビューを取得しました。データグリッドで行われた変更は、適切なクラス オブジェクトに反映されます。これを自分で解決したいと考えていますが、この方法がうまくいかない場合はお知らせください。

編集:私の完全な XAML コードが上にリストされています

4

1 に答える 1

1

TabControl.ContentTemplateではなくを設定する必要がありItemsControl.ItemTemplateます。これを切り替えると、DisplayMemberPath プロパティを使用できるようになり、他のすべてが機能しました。

必要な XAML コードは次のとおりです。

<TabControl ItemsSource="{Binding Path=Exercises}" DisplayMemberPath="ExerciseName">
                <TabControl.ContentTemplate>
                    <DataTemplate>
                            <DataGrid ItemsSource="{Binding Path=Sets}" AutoGenerateColumns="False">
                                <DataGrid.Columns>
                                    <DataGridTextColumn Header="Weight" Binding="{Binding Path=Weight}"/>
                                    <DataGridTextColumn Header="Reps" Binding="{Binding Path=Reps}"/>
                                </DataGrid.Columns>
                            </DataGrid>
                    </DataTemplate>
                </TabControl.ContentTemplate>
            </TabControl>
于 2013-09-16T22:50:17.953 に答える