1

私のメインページにはアプリバーがあり、さまざまなページで共有されています。グリッドビューアイテムをクリックしてアプリバーを開くために、次のコードを記述しました。

XAML

<AppBar Opened="AppBar_Opened" IsOpen="{Binding IsAppBarOpen}">

バックエンド

private void Clock_SelectionChanged(object sender, SelectionChangedEventArgs e)
{            
    App.ViewModel.SelectedClock = (Clock)ThemeGridView.SelectedItem;
    App.WorldViewModel.IsAppBarOpen = true;                  
}

 private void ThemeGridView_ItemClick(object sender, ItemClickEventArgs e)
    {
        App.ViewModel.SelectedClock = (Clock)ThemeGridView.SelectedItem;
        App.WorldViewModel.IsAppBarOpen = true;
    } 

WorldViewModel

private bool _IsAppBarOpen;

public bool IsAppBarOpen
{
   get { return _IsAppBarOpen; }
   set { base.SetProperty(ref _IsAppBarOpen, value); }
}

GridView XAML

<GridView
        Grid.Row="1"
        Grid.Column="1"


         x:Name="ThemeGridView"                    
                ItemsSource="{Binding Clocks}" 
                ItemTemplate="{StaticResource WorldClockTemplate}"
                SelectionChanged="Clock_SelectionChanged"
                SelectionMode="None"
                IsItemClickEnabled="True"
                ItemClick="ThemeGridView_ItemClick"
                >
        <GridView.ItemsPanel>
            <ItemsPanelTemplate>
               <WrapGrid />
            </ItemsPanelTemplate>
        </GridView.ItemsPanel>
    </GridView>

しかし、gridviewアイテムを選択しても、appbarがポップアップしません。バインディングエラーがないので、本当に不思議です!

4

8 に答える 8

3

msdnに従ってIsOpen プロパティをバインドする方法はありません。

プロパティが設定されているときに通知が発生しないため 、プロパティへのバインディングIsOpenは期待どおりの結果をもたらしません。PropertyChanged

于 2012-12-30T03:08:56.017 に答える
1

これは私のために働きます。MVVMLightToolkitを使用しています。

public bool AppBarIsOpen
{
    get { return this._appBarIsOpen; }

    set
    {
        if (this._appBarIsOpen == value) { return; }

        this._appBarIsOpen = value;
        this.RaisePropertyChanged("AppBarIsOpen"); // without INotifyPropertyChanged it doesn't work
    }
}


<AppBar
    IsSticky="True"
    IsOpen="{Binding Path=AppBarIsOpen, Mode=TwoWay}">
于 2012-11-05T19:20:32.960 に答える
1
<AppBar Opened="AppBar_Opened" IsOpen="{Binding IsAppBarOpen, **Mode=TwoWay**}">
于 2012-10-10T13:30:58.387 に答える
0

IsOpen と IsSticky の両方を双方向にバインドする必要があります。そうしないと、アイテムの選択を解除するために 2 回タップする必要があるなどの問題が発生し (アプリ バーを閉じるために 1 回、選択を解除するために 1 回)、アプリ バーを動作させるのにも役立ちます。より標準的に(アイテムが選択されたときにアプリバーがタップでポップアップするのを防ぎます).
アプリ バーを表示するには、次の手順を実行する必要があります (順序は重要です)。

this.IsAppBarSticky = true;
this.IsAppBarOpen = true;

非表示にするには、次の手順を実行します。

this.IsAppBarSticky = false;
this.IsAppBarOpen = false;
于 2013-09-15T16:42:34.907 に答える
0

アプリ バーのクローズ イベントに分離コード ハンドラーを使用せずにこれを機能させる別の方法:

public class AppBarClosedCommand
{
    public static readonly DependencyProperty CommandProperty = DependencyProperty.RegisterAttached("Command", typeof(ICommand),
        typeof(AppBarClosedCommand), new PropertyMetadata(null, CommandPropertyChanged));


    public static void SetCommand(DependencyObject attached, ICommand value)
    {
        attached.SetValue(CommandProperty, value);
    }


    public static ICommand GetCommand(DependencyObject attached)
    {
        return (ICommand)attached.GetValue(CommandProperty);
    }


    private static void CommandPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        // Attach click handler
        (d as AppBar).Closed += AppBar_onClose;
    }


    private static void AppBar_onClose(object sender, object e)
    {
        // Get GridView
        var appBar = (sender as AppBar);


        // Get command
        ICommand command = GetCommand(appBar);


        // Execute command
        command.Execute(e);
    }
}

次に、XAML で次のように使用できます。

common:AppBarClosedCommand.Command="{Binding AppBarClosedCommand}"

コマンド関数は次のようになります。

public void OnAppBarClosed()
    {
        AppBarOpen = false;
    }
于 2014-01-30T15:29:23.587 に答える