0

このシナリオでは、リソースの配列がViewModelに送信されます。

目的は、これらのリソースをビューのWrapPanelのボタンとして表示することです。

現時点では、以下のC#コードを使用してこれを行っています。ただし、Xaml側でこれを実行したいと思います。最終的には、DataTemplatesを使用して、Resourceクラスの他のプロパティでボタンをフォーマットしたいと思います。

これにアプローチする最良の方法は何ですか?前もって感謝します。

    public void SetResources(Resource[] resources)
    {
        WrapPanel panel = this.View.ResourcesPanel;
        panel.Children.Clear();
        foreach(Resource resource in resources)
        {
            var button = new Button
            {
                Tag = resource.Id,
                Content = resource.Content,
                Width = 300,
                Height = 50
            };
            button.Click += this.OnResourceButtonClick;
            panel.Children.Add(button);
        }
    }
4

1 に答える 1

1

アイテムの可変セットを表示する一般的な方法は、を使用することItemsControlです。ItemsControlのItemsSourceプロパティをObservableCollectionオブジェクトの1つにバインドしResourceます。

<UserControl ...>
    <UserControl.DataContext>
        <local:ViewModel/>
    </UserControl.DataContext>
    <Grid>
        <ItemsControl ItemsSource="{Binding Resources}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Tag="{Binding Id}" Content="{Binding Content}"
                            Width="300" Height="50"
                            Click="OnResourceButtonClick"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</UserControl>

ViewModelクラスは次のようになります。

public class ViewModel
{
    public ViewModel()
    {
        Resources = new ObservableCollection<Resource>();
    }

    public ObservableCollection<Resource> Resources { get; private set; }
}

DataContextをキャストすることにより、UserControlまたはMainPageコードでViewModelインスタンスにアクセスできます。

var vm = DataContext as ViewModel;
vm.Resources.Add(new Resource { Id = 1, Content = "Resource 1" });
...
于 2013-02-28T15:55:19.840 に答える