1

我正在尝试创建一个数据绑定的 Tabcontrol,其中每个 TabItem 包含一个 Datagrid,也是数据绑定的。

我的数据结构是这样的:

    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; }
}

我正在尝试将 a 绑定List<Exercise>到 TabControl,并将List<Set>每个练习的绑定到每个 Tab 内的 DataGrid,在两列中显示“Weight”和“Reps”属性。我当前的 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 回答