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您的一个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 回答