我遇到嵌套StackPanels的问题。如果我在下面的代码中定义StackPanels, 按钮绑定到命令(MVVM和命令模式)但不响应按钮单击(不调用命令功能)。当我将stackPanel4放在第二个位置(在stackPanel3下面)时,一切正常。当我在最后一个位置移动stackPanel4时(我有更多StackPanels然后两个内部父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>
答案 0 :(得分:0)
这个问题必须有更多。我们已经重现了您的设置,并且每次都会触发命令事件,无论是StackPanels的顺序如何(基本上与您期望它一样)。
您可以从ViewModel提供任何来源(具体与命令的创建/使用方式有关)吗?对于失败的情况,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
});
}
}
}