【问题标题】:ContentControl.Content not binding correctly in MVVMContentControl.Content 在 MVVM 中未正确绑定
【发布时间】:2016-01-22 13:17:55
【问题描述】:

我有一个 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>`

主视图模型:

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

用户控制视图模型:

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

SearchText 的绑定有效,收藏夹则无效

【问题讨论】:

  • 请向我们展示您的代码
  • 我们还需要您的代码隐藏/ViewModel 代码
  • 添加了更多代码
  • @TomerAgmon1:请不要在问题标题中使用标签。这就是标签的用途

标签: c# wpf mvvm binding


【解决方案1】:

尝试使用ItemsControl

这里有一个很好的教程:http://www.wpf-tutorial.com/list-controls/itemscontrol/

<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.wpftutorial.net/WrapPanel.html

【讨论】:

  • 这对我不起作用或对我有帮助,因为它不是 MVVM。绑定不起作用,因为我通过 DataTemplate 将 UserControl 绑定到 ViewModel,如上所示。
  • 这是 MVVM compliante ... 为什么你可以绑定 ContentControl 而不是 ItemControl
【解决方案2】:

阅读您的更新后,我可以说您的代码不符合 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 2016-12-28
    • 1970-01-01
    • 2021-12-01
    • 2016-06-23
    相关资源
    最近更新 更多