【问题标题】:Problem with nested StackPanels and DataContext inheritance in Silverlight 4Silverlight 4 中嵌套 StackPanel 和 DataContext 继承的问题
【发布时间】:2010-09-22 11:17:08
【问题描述】:

我遇到了嵌套 StackPanel 的问题。如果我在下面的代码中定义 StackPanels, 按钮绑定到命令(MVVM 和命令模式),但不会对按钮单击做出反应(不调用命令函数)。当我将 stackPanel4 放在第二个位置(stackPanel3 下方)时,一切正常。当我将 stackPanel4 移动到最后一个位置时(我有更多的 StackPanel,然后在父 StackPanel 内有两个),按钮未绑定并且命令函数未调用。这种行为的原因可能是什么? 如果我为 stackPanel4 设置 DataContext 就可以了。

    <StackPanel DataContext="{StaticResource vmUserMasterData}" Grid.Column="1" Height="320" HorizontalAlignment="Left" Margin="4,6,4,0" Name="stackPanel1" VerticalAlignment="Top" Width="491">
        <StackPanel Height="40" Name="stackPanel4" Orientation="Horizontal" Width="440">
            <Button Content="Update User Data" Name="button1" Height="23" Width="440" Command="{Binding Path=UpdateDataCommand}"/>
        </StackPanel>
        <StackPanel Height="31" Name="stackPanel3" Orientation="Horizontal" Width="440">
            <sdk:Label Content="Username" Height="28" Name="label2" Width="74" />
            <TextBox Height="23" Name="textBox2" Width="365" Text="{Binding Username, Mode=OneWay}" />
        </StackPanel>
    </StackPanel>

【问题讨论】:

  • 当您说在 StackPanel3 下方时,您的意思是嵌套在 StackPanl3 的结束标记内还是物理上位于其下方?
  • 我的意思是在 StackPanel3 的结束标签下方。

标签: silverlight data-binding inheritance


【解决方案1】:

这个问题肯定还有更多。我们已经复制了您的设置,并且每次都会触发命令事件,无论 StackPanel 的顺序如何(基本上正如您所期望的那样)。

您能否提供您的 ViewModel 的任何来源(特别是与如何创建/使用命令有关)?对于失败的情况,XAML 的描述不清楚。当 Xaml 无法触发时,您能否提供准确的 Xaml 副本?它可能是您机器上的特定面板组合。一个错误的关闭会失败(例如,如果它意外掉到 stackPanel1 之外)。

我们的复制品(无论面板顺序如何):

Xaml:

<UserControl.Resources>
    <SilverlightApplication1:ViewModel x:Key="vmUserMasterData"/>
</UserControl.Resources>
    <Grid x:Name="LayoutRoot">
        <StackPanel DataContext="{StaticResource vmUserMasterData}" Grid.Column="1" Height="320" HorizontalAlignment="Left" Margin="4,6,4,0" Name="stackPanel1" VerticalAlignment="Top" Width="491">
            <StackPanel Height="31" Name="stackPanel3" Orientation="Horizontal" Width="440">
                <sdk:Label Content="Username" Height="28" Name="label2" Width="74" />
                <TextBox Height="23" Name="textBox2" Width="365" Text="{Binding Username, Mode=OneWay}" />
            </StackPanel>
        <StackPanel Height="40" Name="stackPanel4" Orientation="Horizontal" Width="440">
            <Button Content="Update User Data" Name="button1" Height="23" Width="440" Command="{Binding Path=UpdateDataCommand}"/>
        </StackPanel>
    </StackPanel>
    </Grid>

ViewModel 代码:

using System.Windows.Input;
using Microsoft.Practices.Prism.Commands;

namespace SilverlightApplication1
{
    public class ViewModel
    {
        public ICommand UpdateDataCommand { get; set; }
        public string Username { get; set; }

        public ViewModel()
        {
            Username = "Woof!";
            UpdateDataCommand = new DelegateCommand<string>(
                (x) =>
                {
                    int dog = 1;    // breakpoint here
                });
        }
    }
}

【讨论】:

  • stackPanel1 在 Grid 内部,它是 ChildWindow 控件的一部分。
  • 感谢您的回答。这是附加数据:stackPanel1 位于 Grid 内部,它都是 ChildWindow 控件的一部分。另外: vmExample 不在这些 stackPanel 中使用.对于命令模式,我使用了类似于 Josh Smith 的 RelayCommand 模式的模式。关闭标签或类似标签没有问题。运行时一切似乎都正常;唯一的问题是绑定。
  • @Aleksandar:我已经发布了我们的“最小化”样本供您检查。希望在您自己的代码中会出现一些东西,供您尝试。在这一点上,如果没有完整的代码,我们将无法做更多事情,因为我们无法重现问题。
  • 非常感谢大家。我再次重写了代码,再次编译,现在它可以工作了。基本上和你的帖子一样,我真的不知道我做错了什么。
猜你喜欢
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 2011-11-14
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多