0

PrismでMVVMを使用するSilverlightプロジェクトがあります。

http://www.telerik.com/help/silverlight/patterns-and-practices-eventtocommand-prism.htmlをフォローしました

グリッド内の行を選択すると、デバッガーが、Detailオブジェクトを設定した期待されるメソッド(SelectPerson)にヒットします。ただし、詳細オブジェクト(PersonDetail)のバインディング式が間違っていると思います。

これが私のViewModelです:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using Telerik.Windows.Controls;
using Telerik.Windows.Controls.GridView;


namespace RadControlsSilverlight
{
    public class PersonViewModel
    {
        public ObservableCollection<PersonInfo> GridItems { get; set; }
        public PersonInfo PersonDetail { get; set; }
        public DelegateCommand SelectPersonCommand { get; set; }

        public PersonViewModel()
        {
            SetupData();
            SelectPersonCommand = new DelegateCommand(SelectPerson);
        }


        public void SelectPerson(object obj)
        {
            Telerik.Windows.Controls.SelectionChangeEventArgs e = obj as Telerik.Windows.Controls.SelectionChangeEventArgs;
            PersonInfo person = (PersonInfo)e.AddedItems[0];

            PersonDetail = person;

        }



        public void SetupData()
        {
            Random rnd = new Random();

            GridItems = new ObservableCollection<PersonInfo>();

            for (int i = 0; i < 100; i++)
            {
                PersonInfo edi = new PersonInfo();
                edi.ID = i;
                edi.Name = "Name " + i.ToString();
                edi.Date = DateTime.Today.AddDays(i);
                edi.IsAvailable = (i % 3 == 0 ? true : false);

                GridItems.Add(edi);
            }

        }
    }
}

これがビューです

<UserControl x:Class="RadControlsSilverlight.PersonList"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
              xmlns:prismcommands="clr-namespace:RadControlsSilverlight.PrismCommands"

              xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"

      xmlns:local="clr-namespace:RadControlsSilverlight"
    d:DesignHeight="300" d:DesignWidth="400">

    <UserControl.Resources>
        <local:PersonViewModel x:Key="xVM" />
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot"
          Background="White"
          DataContext="{StaticResource xVM}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <telerik:RadGridView x:Name="xRadGridView"
                             ItemsSource="{Binding GridItems, Mode=TwoWay}"


                             prismcommands:SelectionChangedCommand.Command="{Binding SelectPersonCommand}"

                             >

        </telerik:RadGridView>
        <telerik:RadDataForm x:Name="DataForm1"
                             Grid.Column="1"
                              CurrentItem="{Binding PersonDetail, Mode=TwoWay}"
                             Header="Person Detail"/>

    </Grid>
</UserControl>

選択された単一のPersonInfoオブジェクトをDataFormに表示するには、何を変更する必要がありますか?

4

1 に答える 1

1

更新してから再バインドするPersonDetailのUIに通知するイベントがありません。NotificationObjectこれは、PRISMに実装することで実現できます。

public class PersonViewModel : NotificationObject
{
    private PersonInfo _personDetail;
    public PersonInfo PersonDetail
    {
        get { return _personDetail; }
        set
        {
            if(_personDetail != value)
            {
                _personDetail = value;
                //Notify UI of update
                RaisePropertyChanged(() => PersonDetail);               
            }
        }
    }           
}
于 2012-06-14T19:50:09.150 に答える