Silverlight如何将选定的datagrid行传递给视图模型

时间:2011-09-24 02:27:50

标签: silverlight mvvm datagrid

我在视图中有一个数据网格

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

我希望从View中我可以将数据网格的选定项目(行)绑定到我的视图模型中的MyList集合(可能是IList vs OC?)。我只需要所选行中的一个值,例如地址或zip。但是,我是否需要传递整个集合?我可以通过另一种方式将一个单元格值放入视图模型中吗?

例如,这里是我用来填充数据网格的类

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

加载视图模型时会触发此类。我希望能够选择第三行数据,并仅将地址值传递回VM。我的初衷是将整个选定的行传递回vm,然后从该集合中提取地址。

使用selectedItem绑定不起作用,选择一行永远不会触发vm中的inotify事件,所以我知道集合没有被更新,除非我点击DG然后在它之外只传递一个空值。其次,是否有一种更有效的方法来实现这一点,而不是使用后面的代码来提取值然后将其传递给VM?我曾想过在视图中使用选择更改事件,然后将列值设置为传递给vm的绑定字段,但这看起来很糟糕。

感谢您的任何建议或想法。

-cheers

2 个答案:

答案 0 :(得分:1)

它认为你已经在这个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}" /> 

答案 1 :(得分:0)

<强>更新 我正在采取的当前方法是在我有以下

的视图背后的代码中
        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}"/>

绑定到VM中的SelectedID属性

这可以运行并获取VM的值。这在实现中看起来很奇怪(但是使用命令和命令参数的代码要少得多:))。我欢迎任何其他想法。

-cheers