首页 文章

WPF MVVM在包装面板中动态收集用户控件

提问于
浏览
0

我是WPF的新手,但创建了一个带有包装面板的窗口,其中包含从代码后面动态添加的一组用户控件实例 . 每个用户控件最终将显示数据库调用返回的行中的数据 . 我想让它跟随MVVM,但我对架构有点困惑 . 我想我需要有一个用户控件的视图模型和一个窗口的视图模型,它将具有用户控件视图模型的observablecollection . 如何将其绑定到视图侧的包装面板,以便包装面板看到用户控件视图模型的集合,并知道为集合中的每个实例 Build 用户控件?

我认为一旦这一切都正确绑定我可以让一个后台工作者定期查询数据库并创建/更新用户控件视图模型对象,如果我继承INotifyPropertyChanged并在我的用户控件视图模型中触发属性更改事件一切都应该根据绑定进行更新 . 这听起来不错吗?

我已经看到了一些基本的例子,例如绑定到列表框的字符串的observablecollection,但我在将它应用于更复杂的情况时遇到了麻烦 . 关于一般架构或我应该开始的任何建议都非常感谢!

2 回答

  • 2

    基本上,您需要一个可枚举的控件,它对ObservableCollection中的每个元素都有一个项 . 控件的项目需要模板化以使用您的自定义控件显示数据

    为此,请创建一个ObservableCollection,用于保存数据对象并将其用作ListBox的ItemsSource . 然后需要更改ListBox以在WrapPanel而不是默认布局中显示其项目 . 修改ListBox的ItemTemplate以对每个列表项使用自定义用户控件 .

    视图模型:

    public class WindowViewModel
    {
         public ObservableCollection<MyDatabaseObject> DatabaseObjects { get; set; }
    }
    
    
    public class MyDatabaseObject : INotifyPropertyChanged
    {
         public event PropertyChangedEventHandler PropertyChanged;
    
         public string DbName 
         { 
             get { return _dbName; }
             set { 
                    _dbName = value;
                    if (PropertyChanged != null)
                        PropertyChanged(this, new PropertyChangedEventArgs("dbName");
             } 
         }
    
         private _dbName;
    }
    

    XAML:

    <Grid>
        <ListBox ItemsSource="{Binding DatabaseObjects}">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <MyUserControl Title="{Binding DbName}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
    
  • 8

    你在找 ItemsControl 班吗?将 ItemsControl.ItemTemplate 设置为 DataTemplate ,用于ItemUserControlViewModel( - >项目用户控件视图) . 并且 ItemsControl.ItemsPanel 设置为 ItemsPanelTemplate ,带有 WrapPanel .

    ItemControl的 ItemsSource 属性将从 WindowViewModel 绑定到 ObservableCollection<ItemUserControlViewModel> .

相关问题