0

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

所以我像这样实现了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 是否为空来检查是否返回布尔值。

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

这里有什么问题?

4

3 回答 3

0

将 Visibility 属性与 SelectedItem 绑定,并让转换器在 null 值的情况下折叠项目。我也怀疑 selectedItem 是否被调用为 null 转换器。只需重新检查,它将解决问题。

于 2013-06-26T08:03:01.673 回答
0

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

于 2013-06-27T08:18:12.980 回答
0

我刚刚对其进行了测试,似乎绑定不适用于AppBar.IsOpen.

我也绑定了一个Button.IsEnabledGridView.SelectedItem,并且按钮被正确设置为false,但AppBar.IsOpen不是,转换器只被调用一次按钮绑定。

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

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

虽然我认为这只是另一个方向。(编辑:这是一个类似的帖子:open 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();
    }
}
于 2013-06-25T14:32:38.887 回答