WPF绑定到子集合

时间:2016-08-12 23:42:33

标签: c# wpf binding

我在WPF中定义了一个Grid控件...

<Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

再往下,我已经定义了一个ItemsControl ......

 <ItemsControl Name="EntitlementsList" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Stretch"
                  VerticalAlignment="Stretch"
                  ItemsSource="{Binding Entitlements, Mode=TwoWay}"
                  Margin="0 10 0 3" AlternationCount="2">
        <ItemsControl.Template>
            ...
        </ItemsControl.Template>
        <ItemsControl.ItemTemplate>
            <DataTemplate DataType="{x:Type Model:Entitlement}">
                <Grid Margin="0 0 10 0" >
                    <Grid.Style>
                      ...
                    </Grid.Style>
                    <Grid.ColumnDefinitions>
                        ...
                    </Grid.ColumnDefinitions>
                    <ToggleButton Grid.Column="0"
                                  HorizontalAlignment="Left" Margin="0 2 0 0"
                                  VerticalAlignment="Bottom" 
                                  Style="{DynamicResource NotesToggleButton}"
                                  CommandParameter="{Binding}"
                                  Command="{Binding Path=DataContext.GetEntitlementDetails, 
                                            RelativeSource={RelativeSource FindAncestor, 
                                            AncestorType={x:Type ItemsControl}}}" />
                ...
                </Grid>
             </DataTemplate>
        </ItemsControl.ItemTemplate>
</ItemsControl>

这会正确显示我的权利。

ToggleButton的命令定义为......

private RelayCommand _getEntitlementDetails;
public RelayCommand GetEntitlementDetails
{
    get
    {
        return _getEntitlementDetails ?? (_getEntitlementDetails = new RelayCommand(x =>
        {
            CurrentEntitlement = x as Entitlement;
        }));
    }
}

然后我有一个折叠的ItemsControl,直到设置了CurrentEntitlement ...

<ItemsControl Name="ProductList" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="5" Height="150"
              HorizontalAlignment="Stretch" BorderBrush="Transparent"
                  ItemsSource="{Binding ContextManager.CurrentContext.CurrentEntitlement.ProductList, Mode=TwoWay}" 
                  Visibility="{Binding ContextManager.CurrentContext.CurrentEntitlement, 
                                                Converter={StaticResource NullVisibilityConverter}}">
        <ItemsControl.Template>
        ...
</ItemsControl>

我的项目来源是Entitlements类中的ProductList ...

private ObservableCollection<Product> _productList;
public ObservableCollection<Product> ProductList
{
    get { return _productList; }
    set
    {
        _productList = value;
        OnPropertyChanged();
    }
}

...&#34;产品&#34;的所有属性。提高OnPropertyChanged。

现在,我完全期待我的按钮执行命令来设置CurrentEntitlement,使我的第二个ItemsControl在网格中可见并显示ProductList,并逐步执行代码显示CurrentEntitlement确实设置了一个有效的实例ProductList中的项目......但我仍然没有在UI上看到任何内容。我一直在寻找一个解决方案3天,如果这是一个重复的问题,我道歉,但我的机智已经结束了!

我无法看到这个问题。我在这里做错了什么?

Visual Studio 2015社区,目标4.5,在Windows 7 Enterprise SP1上运行。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我终于搞清楚了。对某些错误写入的数据进行了绑定,使第二个ItemsControl失效。