2011-09-24 45 views
1

我有一個觀點Silverlight中如何通過數據網格的選定行查看模型

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

在我的視圖模型中的數據網格,我有以下代碼

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

我希望從視圖中我可以綁定數據網格的選定項目(行)到我的競爭中的MyList集合w模型(也許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;   
    } 

加載視圖模型時,該類觸發類。我希望能夠選擇第三行數據並僅將地址值傳遞迴虛擬機。我的最初想法是將整個選定的行傳遞迴虛擬機,然後從該集合中提取地址。

使用selectedItem綁定不起作用,選擇行從不觸發vm中的inotify事件,所以我知道該集合沒有被更新,除非我點擊DG然後在它之外單擊並傳遞一個空值。其次,是否有更好的方法來做到這一點,而不是使用後面的代碼來拉取值然後傳遞給VM?我曾想過在視圖中使用選擇已更改的事件,然後將列值設置爲傳遞給虛擬機的綁定字段,但這看起來很詭異。

感謝您的任何建議或想法。

-cheers

回答

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

這有效,並獲得了虛擬機的價值。這在實現中似乎很奇怪(但是使用命令和命令參數的代碼少得多:))。我歡迎任何其他想法。

-cheers

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}" /> 
+0

謝謝安東尼我使用我的名單,因爲我試圖選擇整行。在使用selectedItem時使用Datagrid時,這不會選擇整行元素嗎?這可能是我在那裏玩的地方。 – rlcrews

+0

@ramdyc:「整行」只是一個人。 – AnthonyWJones

+0

是的,這是正確的。然而,在這個解決方案中,我必須從Person中派生出一個值,並在第二個查詢中使用它來檢索關聯的數據。我嘗試了您建議的確切代碼,並且從未在ViewModel中觸發selectedItem(即,我將選擇一行,但VM中的屬性永遠不會更新)。任何想法爲什麼selectedItem不會填充? (我有TwoWay設置和viewmodel被綁定到視圖)我可以張貼壓縮示例項目,如果這將有所幫助。謝謝 – rlcrews

相關問題