WinRT FlipView.SelectedIndex 绑定不响应 ViewModel 中的更改
WinRT FlipView.SelectedIndex binding not responding to changes in ViewModel
我想以编程方式更改 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 似乎绑定正确。当我从控制器调用 ViewModel.Log("foo")
时,TextBlock 的文本会更新以反映更改。
问题是当我调用 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>
还有这个视图模型
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++; }); }
}
}
有效。真的。
祝你好运!
我想以编程方式更改 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 似乎绑定正确。当我从控制器调用 ViewModel.Log("foo")
时,TextBlock 的文本会更新以反映更改。
问题是当我调用 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>
还有这个视图模型
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++; }); }
}
}
有效。真的。
祝你好运!