我使用绑定将数据从ViewModel传输到Template,但我想将数据从Teample传输到ViewModel。
<TabControl Grid.Row="2" ItemsSource="{Binding List}" IsSynchronizedWithCurrentItem="True">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<ContentControl Content="{Binding Content}"/>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
我想得到(带有绑定)当前正在创建TabItem的TabIndex 我怎么能这样做?
答案 0 :(得分:1)
我不确定我是否了解您尝试从模板传递给ViewModel的属性。但基本上,如果您想将模板中的值传递给视图模型,则可以使用“OneWayToSource”或“TwoWay”绑定模式进行操作。
如果我正确地取消了你正在传递给你的视图模型的东西是当前所选TabItem的索引,你可以通过以下方式进行 -
<TabControl Grid.Row="2" ItemsSource="{Binding List}" IsSynchronizedWithCurrentItem="True" SelectedIndex={Binding SelectedIndex, Mode="OneWayToSource">
(请注意,视图模型上还应该有一个SelectedIndex依赖项属性)
虽然根据MSDN,默认情况下此属性的绑定模式为“TwoWay”,因此您不必指定绑定模式。
答案 1 :(得分:1)
最简单的方法是挂钩暴露的ICollectionView,因为你已经将IsSynchronisedToCurrentItem设置为true。
未经证实的例子
public ObservableCollection<object> List {get; set;}
public int SelectedIndex
{
get { return CollectionViewSource.GetDefaultView(List).CurrentPosition; }
set { CollectionViewSource.GetDefaultView(List).MoveCurrentTo(value); }
}
然后,您可以绑定到ViewModel中的SelectedIndex属性。
如果这不起作用,直接绑定到ViewModel中的ListCollectionView而不是普通的ObservableCollection,并在上面的代码中用MyListCollectionView替换CollectionViewSource.GetDefaultView(List)。