3

我在 WPF 中有一个使用 MVVM 模式的应用程序,我曾经有一个列表或 observableCollection,例如绑定组合框、DataGrids 等。但是我有一个控件,我想将此控件的动态项添加到包裹面板。

在我的视图模型中创建此控件的视图和视图模型并将其添加到绑定到包装面板的列表中是一个好主意吗?

如果这不是一个好主意,我如何动态地将项目添加到包装面板?

谢谢。

编辑

我添加代码。

我正在尝试这样做,但我没有得到解决方案。

我有一个主视图模型,它创建视图和我的辅助视图的视图模型。在这个主要视图模型中,我使用以下代码:

ucDialogView myDialogView = new ucDialogView ();
ucDialogViewModel myDialogViewModel = new ucDialogViewModel ();
ucDialogView.DataContext = ucDialogViewModel;

我的对话框的视图模型如下:

public class DialogViewModel : BaseViewModel
{

    private ObservableCollection<ControlViewModel> _controls = new ObservableCollection<ControlViewModel>();
    public ObservableCollection<ControlViewModel> Controls
    {
        get { return _myControls; }
        set
        {
            _myControls = value;
            base.RaisePropertyChangedEvent("Controls");
        }
    }



    public myControlViewModel()
    {
        ControlViewModel myControlViewModel = new ControlViewModel();
        Controls.Add(myControlViewModel);
    }

}

我的对话框的 axml:

<UserControl x:Class="MyApp.Views.DialogView"
             Name="Principal"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:my="clr-namespace:myApp.ViewModels"
             mc:Ignorable="d"
             d:DesignHeight="1122" d:DesignWidth="794" Width="794" Height="1122">


        <ItemsControl Grid.Row="1"
              ItemsSource="{Binding Controls, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel HorizontalAlignment="Center" Margin="0,15,0,0" Name="wrpControls" VerticalAlignment="Stretch" Width="Auto" Grid.Row="1" IsItemsHost="True" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="{x:Type my:ControlViewModel}">
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
</UserControl>

但是,我得到一个空对话框。控件是用户控件、视图及其视图模型。

4

1 回答 1

4

我认为更好的方法可能是为DataTemplate您要使用的每个 ViewModel 类型定义一个。然后,您可以将 ViewModel 对象本身添加到 WrapPanel 的项目中。
WPF 基础结构将看到此类对象有一个 DataTemplate,并将负责显示关联的 DataTemplate。

您需要在 WrapPanel 可访问的某个范围内声明 DataTemplate,例如在父页面/窗口App.xaml的资源或资源中:

<DataTemplate DataType="{x:Type local:YourViewModelClass}">
  <ComboBox>
    <!-- Define your bindings and stuff here -->
  </ComboBox>
</DataTemplate>

请注意,WrapPanel它没有ItemsSource属性,因此如果要将其项目绑定到对象列表(例如 ViewModel),则需要使用ItemsControl

<ItemsControl ItemsSource="{Binding YourListOfViewModels}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

假设YourListOfViewModelsObservableCollection您的一个 ViewModel,每次您将 ViewModel 添加到该列表时,它都会以正确的DataTemplate.

于 2013-04-03T07:27:38.487 回答