【问题标题】:WPF DataContext and ICommand withn MVVM带有 MVVM 的 WPF DataContext 和 ICommand
【发布时间】:2011-09-25 04:32:24
【问题描述】:

我已经在我的 xaml 文件中连接了我的按钮单击,然后我想将 StackPanel 中包含的一些文本框绑定到我的集合。

如果我设置了 StackPanel 的 DataContext 按钮点击不再起作用;但是,如果我在每个 TextBox 上设置 DataContext,则单击按钮会像以前一样工作。我不知道为什么...

此标记有效

<StackPanel>

    <TextBlock>Product Name</TextBlock>            
    <TextBox Width="200" DataContext="{Binding Path=ProductCollection, Mode=TwoWay}" Text="{Binding Path=ProductName, Mode=TwoWay}"></TextBox>

    <TextBlock>Unit Price</TextBlock>
    <TextBox Width="200" DataContext="{Binding Path=ProductCollection, Mode=TwoWay}" Text="{Binding Path=UnitPrice, Mode=TwoWay}"></TextBox>

    <Button Margin="20" x:Name="UpdateProduct" Content="Update Product" Command="{Binding AmendProduct}" />                


</StackPanel>

此标记不起作用 - 我已将 DataContext 移至堆栈面板。

<StackPanel DataContext="{Binding Path=ProductCollection, Mode=TwoWay}">       

   <TextBlock>Product Name</TextBlock>            
   <TextBox Width="200" Text="{Binding Path=ProductName, Mode=TwoWay}"></TextBox>

   <TextBlock>Unit Price</TextBlock>
   <TextBox Width="200" Text="{Binding Path=UnitPrice, Mode=TwoWay}"></TextBox>

   <Button Margin="20" x:Name="UpdateProduct" Content="Update Product" Command="{Binding AmendProduct}" />

</StackPanel>

【问题讨论】:

    标签: wpf xaml data-binding


    【解决方案1】:

    当您将 DataContext 放入 StackPanel 时,它期望 AmendProduct 位于 PathCollection 中(即它期望的实际路径是 ProductCollection.AmendProduct)。

    这就是它在第一个中起作用的原因。 DataContext 在 Scope 基础上工作(即层次结构)

    【讨论】:

    • +1 这回答了我想说的问题。只是添加到它,如果你愿意,你可以使按钮命令工作:Command="{Binding ElementName=WindowOrUserControlName, Path=AmendProduct}"。
    • 是的,你必须提供你自己的覆盖元素名称(如果你不想使用默认元素,它通常是范围内的 DataContext)。
    【解决方案2】:

    对于 MVVM,人们通常会提供一个完整的类,专门用作整个控件的“视图模型”,因此您通常不会在控件中设置新的 DataContext。视图模型将准确地公开视图所需的属性,例如 ProductName、UnitPrice 等。

    您所展示的创建此控件的控件可能会为此控件设置 DataContext。 (并且您可以递归地对您创建的其他自定义控件执行相同的操作。)

    【讨论】:

      猜你喜欢
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多