0

我是 MVVM 的新手,在以下情况下需要帮助。

我在视图上添加了一个堆栈面板,现在我必须通过 viewmodel 向这个堆栈面板动态添加一些控件。为此,我需要在我的视图模型中处理堆栈面板。谁能指导我如何在我的视图模型中访问堆栈面板。

我在其他博客中读到它可以通过使用 Dependency 属性来完成。但我仍然无法找到解决这个问题的方法。

4

4 回答 4

4

首先要注意几点。MVVM 模式中 ViewModel 的目的是提供与 View 的分离。因此,您的 ViewModel 应该不了解 View 本身,也不了解 View 中包含的控件。其次,您应该尝试做的是让您的 View 绑定到您的 ViewModel 的一个属性(理解您的 ViewModel 充当您的 View 的 DataContext)。通常,您会将控件的 ItemsSource 属性绑定到 ViewModel 中的某个集合。但是,您会注意到 StackPanel 没有实现 ItemsSource 依赖项属性。相反,使用 ItemsControl 代替 StackPanel。我建议对 MVVM 模式和绑定机制进行一些额外的阅读,以进一步澄清。

于 2012-12-20T21:23:06.430 回答
0

完全同意 Backlash,看来你的 ViewModel 和你的 View 耦合太多了;网上有很多资源,但这里有一些我比较喜欢:

于 2012-12-21T08:30:59.817 回答
0

谢谢大家的帮助,我解决了这个问题

在视图模型中,我创建了 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>
于 2012-12-21T21:07:29.743 回答
0

我以前用用户控件做过这个。我有一组对象,我需要动态地控制 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 等。

于 2012-12-21T16:38:09.140 回答