Проблема с вложенными StackPanels и наследованием DataContext в Silverlight 4 - PullRequest
0 голосов
/ 22 сентября 2010

У меня проблема с вложенными StackPanels. Если я определю StackPanels как в коде ниже, кнопка привязывается к команде (MVVM и шаблон команды), но не реагирует на нажатие кнопки (функция команды не вызывается). Когда я ставлю stackPanel4 на вторую позицию (ниже stackPanel3) все работает нормально. Когда я перемещаю stackPanel4 на последнюю позицию (у меня больше StackPanels, чем два внутри родительского StackPanel), кнопка не привязывается и командная функция не вызывается. Что может быть причиной такого поведения? Если я установлю DataContext для stackPanel4, он будет работать нормально.

    <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>

1 Ответ

0 голосов
/ 22 сентября 2010

Там должно быть больше к этой проблеме.Мы воспроизвели вашу настройку, и событие команды запускается каждый раз, независимо от порядка 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
                });
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...