我是 MVVM 的新手,在以下情况下需要帮助。
我在视图上添加了一个堆栈面板,现在我必须通过 viewmodel 向这个堆栈面板动态添加一些控件。为此,我需要在我的视图模型中处理堆栈面板。谁能指导我如何在我的视图模型中访问堆栈面板。
我在其他博客中读到它可以通过使用 Dependency 属性来完成。但我仍然无法找到解决这个问题的方法。
我是 MVVM 的新手,在以下情况下需要帮助。
我在视图上添加了一个堆栈面板,现在我必须通过 viewmodel 向这个堆栈面板动态添加一些控件。为此,我需要在我的视图模型中处理堆栈面板。谁能指导我如何在我的视图模型中访问堆栈面板。
我在其他博客中读到它可以通过使用 Dependency 属性来完成。但我仍然无法找到解决这个问题的方法。
首先要注意几点。MVVM 模式中 ViewModel 的目的是提供与 View 的分离。因此,您的 ViewModel 应该不了解 View 本身,也不了解 View 中包含的控件。其次,您应该尝试做的是让您的 View 绑定到您的 ViewModel 的一个属性(理解您的 ViewModel 充当您的 View 的 DataContext)。通常,您会将控件的 ItemsSource 属性绑定到 ViewModel 中的某个集合。但是,您会注意到 StackPanel 没有实现 ItemsSource 依赖项属性。相反,使用 ItemsControl 代替 StackPanel。我建议对 MVVM 模式和绑定机制进行一些额外的阅读,以进一步澄清。
完全同意 Backlash,看来你的 ViewModel 和你的 View 耦合太多了;网上有很多资源,但这里有一些我比较喜欢:
谢谢大家的帮助,我解决了这个问题
在视图模型中,我创建了 FrameWorkElement 类型的 ObservableCollection,它可以包含将在运行时决定的任何其他控件。控件可以是文本框或按钮。
Public ObservableCollection < FrameWorkElement > Test
{
get{....} set{...}
}
现在我可以添加/设置任何其他控件来测试
Tets.Add(new TextBox()); Or Button , this will be decided at runtime.
现在将此“测试”绑定到 ItemsControl。
<ItemsControl x:Name="itemsControl" ItemsSource={Biding Test}>
</ItemsControl>
我以前用用户控件做过这个。我有一组对象,我需要动态地控制 StackPanel 中的控件。您也可以使用任何控件来执行此操作...在此示例中我将使用 TextBlock。
使用要包装在堆栈面板中的控件创建数据模板:(MyText 是集合对象中的一个属性...见下文)
<DataTemplate x:Key="MyTemplate">
<Grid Margin="0">
<StackPanel>
<TextBlock Text="{Binding Path=MyText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
</TextBlock>
</StackPanel>
</Grid>
</DataTemplate>
然后关键是使用 ItemsControl 绑定到对象集合:(集合在您的 viewModel 上)
<ItemsControl
ItemsSource="{Binding ACollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ItemTemplate=" {StaticResource MyTemplate}" Background="Transparent">
</ItemsControl>
因此,例如,如果“ACollection”中有 3 个项目,则将有 3 个 TextBlocks 堆叠在一起,如果集合中有 5 个,则将有 5 个 TextBlocks 等。