使用MVVM,绑定和模板获取属性

时间:2012-02-14 06:46:17

标签: wpf templates binding mvvm

我使用绑定将数据从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 我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

我不确定我是否了解您尝试从模板传递给ViewModel的属性。但基本上,如果您想将模板中的值传递给视图模型,则可以使用“OneWayToSource”或“TwoWay”绑定模式进行操作。

如果我正确地取消了你正在传递给你的视图模型的东西是当前所选TabItem的索引,你可以通过以下方式进行 -

<TabControl Grid.Row="2" ItemsSource="{Binding List}" IsSynchronizedWithCurrentItem="True" SelectedIndex={Binding SelectedIndex, Mode="OneWayToSource">

(请注意,视图模型上还应该有一个SelectedIndex依赖项属性)

虽然根据MSDN,默认情况下此属性的绑定模式为“TwoWay”,因此您不必指定绑定模式。

http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedindex.aspx

答案 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)。