我有一个带有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。
这里有什么不妥?
答案 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事件中设置它。