2010-09-22 43 views
0

嵌套StackPanels有問題。如果我在下面的代碼中定義了StackPanels,則 按鈕將綁定到命令(MVVM和命令模式),但不會對按鈕單擊(命令函數未調用)做出反應。當我把stackPanel4放在第二個位置(在stackPanel3下面)時,一切正常。當我將stackPanel4移動到最後位置時(我有更多的StackPanels,然後是兩個父StackPanel內部),按鈕沒有被綁定,並且沒有調用命令函數。什麼可能是這種行爲的原因? 如果我爲stackPanel4設置DataContext,它就可以。在Silverlight 4中嵌套StackPanels和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

當你說下面StackPanel3,你的意思嵌套,或者物理地位於StackPanl3的結束標記之下? – Ben 2010-09-22 11:49:53

+0

我的意思是身體在StackPanel3的結束標記之下。 – Aleksandar 2010-09-22 12:01:00

回答

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> 

視圖模型代碼:

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 
       }); 
     } 
    } 
} 
+0

stackPanel1位於Grid內部,它全部是ChildWindow控件的一部分。 – Aleksandar 2010-09-22 12:24:53

+0

感謝您的回答。這是額外的數據:stackPanel1在Grid中,它是ChildWindow控件的所有部分。也:<控件:ChildWindow.Resources> <本地:ViewModelExample X:鍵= 「vmExample」/> <本地:ViewModelUserMasterData X:鍵= 「vmUserMasterData」/> vmExample不在這些stackPanel中使用。對於命令模式,我使用的模式類似於Josh Smith的RelayCommand模式。關閉標籤或類似物沒有問題。在運行時似乎一切正常;唯一的問題是綁定。 – Aleksandar 2010-09-22 12:36:15

+0

@Aleksandar:我已經發布了我們的「最低限度」樣本供您檢查。希望有一些東西會在你自己的代碼中出現,供你試用。如果沒有完整的代碼,我們不能做更多的事情,因爲我們無法重現問題。 – 2010-09-22 12:56:21