c# - WinRT FlipView.SelectedIndex 绑定(bind)不响应 ViewModel 中的更改

标签 c# mvvm windows-runtime winrt-xaml mytoolkit

我想以编程方式更改 FlipView 的 SelectedIndex。我的 ViewModel 看起来像这样:

public class MyViewModel : ViewModelBase {
   private int _flipViewIndex;

   public int FlipViewIndex
   {
      get { return _flipViewIndex; }
      private set { Set(ref _flipViewIndex, value); }
   }

   private string _logText;

   public string LogText
   {
      get { return _logText; }
      private set { Set(ref _logText, value); }
   }

   public async void Log(string text)
   {
      CoreDispatcher dispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher;
      if (dispatcher.HasThreadAccess)
      {
         LogText += text + "\n";
      }
      else
      {
         await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Log(text));
      }
   }

   public async void SetIndex(int index)
   {
      CoreDispatcher dispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher;
      if (dispatcher.HasThreadAccess)
      {
         FlipViewIndex = index;
      }
      else
      {
         await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => SetIndex(index));
      }
   }
}

Set() 引发 INotifyPropertyChanged.PropertyChanged()

我的 XAML 如下所示:

<views:BaseView>
 <Grid DataContext="{StaticResource ViewModel}">
  <FlipView SelectedIndex="{Binding FlipViewIndex}">
    <Control1 />
    <Control2 />
    <Control3 />
   </FlipView>
   <TextBlock Text="{Binding LogText}" />
  </Grid>
</views.BaseView>

View 和 ViewModel 似乎绑定(bind)正确。当我从 Controller 调用 ViewModel.Log("foo") 时,TextBlock 的文本会更新以反射(reflect)更改。

问题是当我调用 ViewModel.SetIndex(n) 时,FlipView 的 SelectedIndex 没有更新为 n,它只是保持在 0。知道为什么会发生这种情况吗?

最佳答案

我刚刚确认这有效。

<FlipView FontSize="200"
          ItemsSource="{Binding Items}"
          SelectedIndex="{Binding Index, Mode=TwoWay}" />

只是这样做。

<Page.BottomAppBar>
    <CommandBar>
        <AppBarButton Command="{Binding PrevCommand}"
                      Icon="Previous"
                      Label="Previous" />
        <AppBarButton Command="{Binding NextCommand}"
                      Icon="Next"
                      Label="Next" />
    </CommandBar>
</Page.BottomAppBar>

还有这个 View 模型

public class MyViewModel : BindableBase
{
    public MyViewModel()
    {
        foreach (var item in new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 })
            this.Items.Add(item);
    }

    ObservableCollection<int> _Items = new ObservableCollection<int>();
    public ObservableCollection<int> Items { get { return _Items; } }

    int _Index = default(int);
    public int Index { get { return _Index; } set { base.SetProperty(ref _Index, value); } }

    public DelegateCommand PrevCommand
    {
        get { return new DelegateCommand(() => { this.Index--; }); }
    }

    public DelegateCommand NextCommand
    {
        get { return new DelegateCommand(() => { this.Index++; }); }
    }
}

有效。确实如此。

祝你好运!

关于c# - WinRT FlipView.SelectedIndex 绑定(bind)不响应 ViewModel 中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28099831/

相关文章:

c# - 隐藏 ListView ,直到按下按钮

c# - react 性扩展 : Process events in batches + add delay between every batch

c# - 尝试激活时无法解析服务类型

c# - InvalidDataContractException ("Type cannot be serialized") 使用 WCF DataContract 时出错

c# - 如何检索 StructureMap 中所有命名实例的名称

c# - 将 UWP 库加载到 .NET Framework 应用中

c# - 从代码绑定(bind)到 WinRT/UWP 中的自定义附加属性

c# - 使用 FileShare.Delete 会导致 UnauthorizedAccessException 吗?

c# - MvvmLight,Messenger和Async方法调用

c# - 如何将 xml 绑定(bind)到 wpf TreeView ?