Silverlight Как передать выбранную строку сетки данных для просмотра модели - PullRequest
1 голос
/ 24 сентября 2011

У меня есть сетка данных в представлении

<Grid x:Name="LayoutRoot" Background="White" Width="600" MaxHeight="150">
    <sdk:DataGrid x:Name="grid1" ItemsSource="{Binding Persons}" SelectedItem="{Binding MyList, Mode=TwoWay}">
    </sdk:DataGrid>
</Grid>

В моей ViewModel у меня есть следующий код

private ObservableCollection<string> myList;
    public ObservableCollection<string> MyList
    {
        get { return myList; }
        set
        {
            myList = value;
            NotifyPropertyChanged(vm => vm.MyList);
        }

И для DG

 private ObservableCollection<Person> person;    
    public ObservableCollection<Person> Persons
    {
        get { return person; }
        set
        {
            person = value;
            NotifyPropertyChanged(vm => vm.Persons);
        }
    }

Iнадеялся, что из представления я смогу связать выбранный элемент (строку) сетки данных с коллекцией MyList в моей модели представления (может быть, IList против OC?).Мне нужно только одно значение из выбранной строки, например адрес или почтовый индекс.Но нужно ли передавать всю коллекцию, могу ли я получить только одно значение ячейки в модель представления другим способом?

Например, вот класс, который я использую для заполнения сетки данных

        public void CreateList()
    {
        Person p = new Person();
        p.FirstName = "Bob";
        p.LastName = "Jones";
        p.Address = "123 Main Street";
        p.City = "Wilmington";
        p.State = "NC";
        p.Zip = "12345";


        Person p1 = new Person();
        p1.FirstName = "Sue";
        p1.LastName = "Smith";
        p1.Address = "1222 Main Street";
        p1.City = "Tampa";
        p1.State = "FL";
        p1.Zip = "12345";

        Person p2 = new Person();
        p2.FirstName = "Chris";
        p2.LastName = "Jones";
        p2.Address = "234 Water Street";
        p2.City = "Dallas";
        p2.State = "TX";
        p2.Zip = "22222";

        Person p3 = new Person();
        p3.FirstName = "Andy";
        p3.LastName = "Jones";
        p3.Address = "434 Main Street";
        p3.City = "Columbia";
        p3.State = "SC";
        p3.Zip = "12345";

        ObservableCollection<Person> Result = new ObservableCollection<Person>();
        Result.Add(p);
        Result.Add(p1);
        Result.Add(p2);
        Result.Add(p3);

        Persons = Result;          
    }

Этот класс запускается при загрузке модели представления.Я хотел бы иметь возможность выбрать третью строку данных и передать только значение адреса обратно в виртуальную машину.Моей первоначальной мыслью было передать всю выбранную строку обратно в виртуальную машину, а затем извлечь адрес из этой коллекции.

Использование привязки selectedItem не работает, выбор строки никогда не вызывает событие inotify в виртуальной машине, поэтому я знаю, что коллекция не обновляется, пока я не нажму на DG, а затем за ее пределами, который пропускает только нользначение.Во-вторых, есть ли более эффективный способ сделать это по сравнению с использованием кода для извлечения значения и его передачи в виртуальную машину?Я подумал об использовании события изменения выбора в представлении, а затем установил значение столбца в связанном поле, которое передается в виртуальную машину, но это кажется хакерским.

Спасибо за любые предложения или идеи.

-cheers

Ответы [ 2 ]

1 голос
/ 24 сентября 2011

Кажется, вы добавили немного криволинейного шара с этим свойством MyList, к которому вы хотите "привязать выбранный элемент". В любом другом месте, включая ваше собственное решение, вы ссылаетесь на привязку к одному элементу. Так зачем иметь свойство для получения этого типа списка?

Мне кажется, что вам нужно, чтобы удалить MyList и просто иметь: -

 private Person mySelectedItem;
 public Person SelectedItem
 {
      get
      {
          return mySelectedItem;
      }
      set
      {
          mySelectedItem = value;
          NotifyPropertyChanged("SelectedItem");
      }
 }

Теперь ваша привязка к DataGrid будет иметь смысл: -

<sdk:DataGrid x:Name="grid1" ItemsSource="{Binding Persons}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}">   

А ваш TextBlock будет выглядеть примерно так: -

  <TextBlock x:Name="textholder" Text="{Binding SelectedItem.FirstName}" /> 
0 голосов
/ 24 сентября 2011

Обновление Текущий подход, который я использую для этого, находится в коде позади представления, которое у меня есть следующее

        private void grid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        Person selectedPerson = grid1.SelectedItem as Person;
        textholder.Text = selectedPerson.Address;
    }

Тогда в представлении у меня есть текстовое поле

 <TextBlock x:Name="textholder" Text="{Binding SelectedID, Mode=TwoWay}"/>

Который связан со свойством SelectedID в виртуальной машине

Это работает и возвращает значение ВМ. Это просто кажется странным в реализации (но это намного меньше кода, который использует команды и параметры команды :)). Я бы приветствовал любые другие идеи.

-cheers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...