Windows应用商店应用:将应用栏条IsOpen属性绑定到ListView所选项目

时间:2013-06-25 11:19:06

标签: c# xaml windows-8 windows-store-apps winrt-xaml

我有一个带有ListView和AppBar的页面。我想确保AppBar无法打开/可见,除非ListViews的所选项目不为null。

所以我实现了这样的AppBar:

<Page.BottomAppBar>
        <AppBar x:Name="bottomAppBar" Padding="10,0,10,0">
            <AppBar.IsOpen>
                <Binding ElementName="MyGrid" Path="SelectedItem" Converter="{StaticResource ValueToBooleanConverter}"/>
            </AppBar.IsOpen>
        </AppBar>
    </Page.BottomAppBar>

ValueToBooleanConverter 是一个IValueConverter,它根据GridView的SelectedItem是否为null来检查返回布尔值。

即使GridView Selected Item为空,也会出现AppBar。

这里有什么不妥?

3 个答案:

答案 0 :(得分:0)

我刚测试了它,似乎绑定不适用于AppBar.IsOpen

我也将Button.IsEnabled绑定到GridView.SelectedItem,并且按钮已正确设置为false,但AppBar.IsOpen未设置,转换器仅被调用一次按钮绑定。

这可能与此有关:http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.appbar.isopen

  

注意绑定到IsOpen属性没有预期的结果,因为设置属性时不会发生PropertyChanged通知。

虽然我认为这只意味着另一个方向。 (编辑:这是一个simialar帖子:opening the appbar in metro style apps using binding property

以下是我使用的代码:

<common:LayoutAwarePage.BottomAppBar>
    <AppBar IsOpen="{Binding SelectedItem, Converter={StaticResource ObjectToBooleanConverter}, ElementName=gridView}"
            IsSticky="True"
            Background="#E5F50000" />
</common:LayoutAwarePage.BottomAppBar>


<Grid Style="{StaticResource LayoutRootStyle}">
    <Grid.RowDefinitions>
        <RowDefinition Height="140" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <GridView x:Name="gridView"
              HorizontalAlignment="Right"
              Margin="0"
              Grid.Row="1"
              Width="469">
        <Button Content="asdf" />
        <Button Content="asdf" />
        <Button Content="asdf" />
    </GridView>
    <Button x:Name="bsetnull"
            Content="setnull"
            HorizontalAlignment="Left"
            Margin="78,10,0,0"
            Grid.Row="1"
            VerticalAlignment="Top" Tapped="bsetnull_Tapped"/>
    <Button x:Name="bsettoone"
            Content="settoone"
            HorizontalAlignment="Left"
            Margin="78,71,0,0"
            Grid.Row="1"
            VerticalAlignment="Top" Tapped="bsettoone_Tapped"/>
    <Button Content="Button"
            HorizontalAlignment="Left"
            Margin="78,147,0,0"
            Grid.Row="1"
            VerticalAlignment="Top"
            IsEnabled="{Binding SelectedItem, Converter={StaticResource ObjectToBooleanConverter}, ElementName=gridView}" />

</Grid>

转换器

public class ObjectToBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value == null)
            return false;
        else
            return true;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

答案 1 :(得分:0)

使用SelectedItem绑定Visibility属性并具有转换器,以便在空值的情况下折叠项目。此外,我怀疑在selectedItem被调用null转换器的情况下。只需重新检查即可解决问题。

答案 2 :(得分:0)

您已经发布了微软链接(http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.appbar.isopen),所以也许你自己提供一个属性来绑定并在appbar的Opened和Closed事件中设置它。