ContentControl.Content在MVVM中无法正确绑定

时间:2016-01-22 13:17:55

标签: c# wpf mvvm binding

我有一个MVVM应用程序。我想要从ViewModel表示一组按钮并且是动态的。 这意味着我想用ViewModel中的控件填充窗口。

我尝试创建一个内容控件并将它的Content属性绑定到一个Grid,我将把按钮放入其中。绑定不起作用,它仍然是空的。

我尝试将它绑定到一个简单的字符串,但仍然没有。我应该提到其他简单的绑定确实有效,这就是为什么它很奇怪。

创建UserControl:

 <TabControl HorizontalAlignment="Left" Height="696" Margin="429,0,0,32" VerticalAlignment="Bottom" Width="552" ItemsSource="{Binding TabCollection}">
        <TabControl.Resources>
        </TabControl.Resources>
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Header}"/>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <cattab:CategoryTab/>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>`

UserControl中的绑定:

 <ContentControl HorizontalAlignment="Left" Height="286" Margin="98,152,0,-396" VerticalAlignment="Top" Width="313">
        <ContentControl Content="{Binding Favorites}" Margin="0,30,0,0" VerticalAlignment="Top"/>
    </ContentControl>`

MainViewModel:

//**** Initilize TabCollection with fake data (temporary)            
TabCollection.Add(new CategoryTabViewModel { Header = "בדיקה11" });
TabCollection.Add(new CategoryTabViewModel { Header = "בדיקה2" });

UserControl ViewModel:

public CategoryTabViewModel()
{
    SearchText = "bbbaaaa";
    Favorites.Add(new Button());
}

SearchText的绑定工作,收藏夹不是

2 个答案:

答案 0 :(得分:1)

尝试使用ItemsControl

这是一个很好的教程:enter image description here

<ItemsControl HorizontalAlignment="Left" Height="286" Margin="98,152,0,-396" VerticalAlignment="Top" Width="313" Content="{Binding Favorites}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <controlsToolkit:WrapPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding Name}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

使用WrapPanel管理您的布局:http://www.wpf-tutorial.com/list-controls/itemscontrol/

答案 1 :(得分:1)

在阅读完更新后,我可以说您的代码不符合MVVM,因为您的ViewModel层知道View层(您在ViewModel中创建了按钮)

您需要做什么:

您的CategoryTab的XAML

<ItemsControl ItemsSource="{Binding Favorites, Mode=OneWay}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button/><!--Show whatever you want here-->
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

如果要在每次将对象添加到“收藏夹”时创建新按钮,则需要将“收藏夹”设为“ObservableCollection”。