Передача данных в дочернее окно в Silverlight 4 с помощью MVVM - PullRequest
3 голосов
/ 21 мая 2010

У меня есть таблица данных с реализацией основных деталей следующим образом:

<data:DataGrid x:Name="dgData"  Width="600" ItemsSource="{Binding Path=ItemCollection}"
                       HorizontalScrollBarVisibility="Hidden" CanUserSortColumns="False" RowDetailsVisibilityChanged="dgData_RowDetailsVisibilityChanged">
                    <data:DataGrid.Columns>
                        <data:DataGridTextColumn Header="Item" Width="*" Binding="{Binding Item,Mode=TwoWay}"/>
                        <data:DataGridTextColumn Header="Company" Width="*" Binding="{Binding Company,Mode=TwoWay}"/>

                    </data:DataGrid.Columns>
                    <data:DataGrid.RowDetailsTemplate>
                        <DataTemplate>
                            <data:DataGrid x:Name="dgrdRowDetail" Width="400" AutoGenerateColumns="False" HorizontalAlignment="Center" 
                                       HorizontalScrollBarVisibility="Hidden" Grid.Row="1">
                                <data:DataGrid.Columns>
                                    <data:DataGridTextColumn Header="Date" Width="*" Binding="{Binding Date,Mode=TwoWay}"/>
                                    <data:DataGridTextColumn Header="Price" Width="*" Binding="{Binding Price, Mode=TwoWay}"/>
                                    <data:DataGridTemplateColumn>
                                        <data:DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <Button Content="Show More Details" Click="buttonShowDetail_Click"></Button>
                                            </DataTemplate>
                                        </data:DataGridTemplateColumn.CellTemplate>
                                    </data:DataGridTemplateColumn>
                                </data:DataGrid.Columns>
                            </data:DataGrid>
                        </DataTemplate>
                    </data:DataGrid.RowDetailsTemplate>
                </data:DataGrid>

Я хочу открыть дочернее окно, нажав кнопку, которая показывает более подробную информацию о продукте.

I 'м с использованием шаблона MVVM.Моя модель содержит метод, который принимает имя элемента в качестве входного и возвращает данные сведений.

Моя проблема заключается в том, как передать элемент в ViewModel, которая будет получать данные сведений из модели?и где я могу открыть новое окно ребенка?В View или ViewModel?

Пожалуйста, помогите. Спасибо.

Ответы [ 2 ]

5 голосов
/ 15 июня 2010

Открытие дочернего окна из модели представления нарушает разделение между представлением и моделью представления, о которых должен быть весь шаблон. Таким образом, вы, вероятно, не имеете большого выбора относительно того, откуда вы открываете дочернее окно - код для страницы, на которой находится сетка. (И это также нарушает шаблон, но, если не считать сложного решения, это все, что вы можете сделать.) Я использую шаблон MVVM, но я не "религиозен" в этом. Я буду нарушать некоторые правила модели, когда это диктует эффективность.

Что касается передачи элемента в ViewModel - я полагаю, вы можете создать свойство в ViewModel, которое представляет идентификатор для элемента. Я использую дочерние окна как формы ввода данных для обновления и добавления. Я склонен создавать ViewModel для каждого из них. В вашем случае у вас будет ViewModel, который представляет детали элемента. Там будет какой-то идентификатор, связанный с предметом и деталями. Это было бы общедоступным свойством на ViewModel. Вы можете создать конструктор для дочернего окна, который принимает этот идентификатор в качестве параметра. Затем конструктор дочернего окна может создать ViewModel и отправить ему идентификатор.

Примерно так - где DomainEdit - это имя дочернего окна.

    public DomainEdit()
    {
        InitializeComponent();

        devm = new DomainEditVM();
        DataContext = devm;
    }

    public DomainEdit(Guid domainId) : this()
    {
        devm.DomainId = domainId;
        devm.GetDomain();
        txtTitle.Text = "Edit Domain";
    }

Затем из кода, за которым происходит нажатие кнопки для сетки, вы создаете дочернее окно с новым конструктором, передавая идентификатор, полученный из привязки элемента в строке сетки, и модель независимого представления для дочернего элемента. окно вступает во владение.

По крайней мере, это то, что работает для меня.

0 голосов
/ 07 января 2011

Шаблон посредника (служба обмена сообщениями между представлениями о нашем составном приложении) выполняет свою работу.Кроме того, делегируйте создание подробного вида в службе дочернего окна и передайте выбранный объект через службу обмена сообщениями.Тогда вы не получите никакого нарушения шаблона.

...