3

MVVM パターンを使用する WPF のアプリケーションがあり、リストまたは observableCollection を使用して、たとえば、comboBox、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 を表示します。

App.xamlたとえば、親ページ/ウィンドウのリソースまたは のリソースで、WrapPanel にアクセスできるスコープで DataTemplate を宣言する必要があります。

<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>

YourListOfViewModelsが ViewModel の であると仮定するとObservableCollection、ViewModel をそのリストに追加するたびに、正しい で表示されますDataTemplate

于 2013-04-03T07:27:38.487 に答える