环绕面板中用户控件的 WPF MVVM 动态集合

标签 wpf mvvm

我是 WPF 新手,但创建了一个带有包装面板的窗口,其中包含从后面的代码动态添加的用户控件实例的集合。每个用户控件最终将显示从数据库调用返回的行中的数据。我想让它遵循 MVVM,但在架构上有点卡住。我想我需要有一个用户控件的 View 模型和一个窗口的 View 模型,它将拥有用户控件 View 模型的 observablecollection。如何将其绑定(bind)到 View 侧的包装面板,以便包装面板看到用户控件 View 模型的集合并知道为集合中的每个实例建立用户控件?

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

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

最佳答案

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

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

View 模型:

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

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

关于环绕面板中用户控件的 WPF MVVM 动态集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10063377/

相关文章:

c# - MEF更新导出的部件元数据(元数据 View 无效,因为属性有属性设置方法)

c# - WPF TabItem HeaderTemplate

wpf - 我应该如何实现应用程序范围的字体大小设置和允许用户选择该字体大小的对话框?

wpf - 从 ViewModel 绑定(bind) WPF ComboBox 的数据 - 无法更改所选项目

c# - WPF 中 ViewModel 上的线程锁定

WPF独占模式

c# - 具有行和列标题WPF的ItemsControl

c# - GridViewColumn 内容和 VerticalAlignment

asp.net - 关于编写 “flexible” API的想法?

wpf - PRISM 应用程序的整体应用程序架构