2014-01-22 22 views
0

以下是情況:我有一個對象列表,每個對象都以一個ID號引用。我試圖在基於對象的ID號碼一個列表視圖的列設置值:綁定 - 爲ListView列動態選擇數據

<ListView  Name="Listview1" 
       Itemsource="{Binding ObjectList}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Header1" DisplayMemberBinding="{Binding subObject.property}"/> 
      <GridViewColumn Header="Header2" DisplayMemberBinding="{Binding PropertyOfAnItemInAList"/> 
     </GridView> 
    </ListView.View> 
</ListView> 

鏈表類是視圖模型中的屬性,並且證明一個ObservableCollection到ListView進行處理。 Header1和Header2綁定到名爲「ObjectList」的ObservableCollection中的項目內的屬性。

這一切都適用於Header1。問題是Header2需要從ObservableCollection的每個元素中的列表中選擇一個項目,並根據ObjectList中被引用項目的另一個屬性來顯示它。

那麼我該如何做到這一點?

我已經成功地得到它的工作通過設置變量中的鏈表類的對象稱爲「currentSelection」,然後把它設置在通過鏈表類,從的ItemSource綁定迭代產生的ListView:

public ObservableCollection<theObject> ObjectList { 

    get { 
     foreach (theObject obj in sourceCollection) { 

      obj.CurrentID = MyID; 
     } 

     return new ObservableCollection<theObject>sourceCollection // <-- secondary question: Is this the best way to send an observableCollection to a View??? 
    } 
} 

但是,這種感覺有點像黑客而不是最佳實踐,那麼還有另一種更好的方式來完成同樣的事情嗎?

編輯:

這裏的內部鏈表類對象的一個​​片斷,我現在擁有它。

public class ObjectInObjectList { 

    /* constructor and various properties snipped to save space */ 

    private subObject subObj; 

    public int CurrentID {get; set;} 

    public SubObject { 

     get { return subObject; } // etc... 
    } 

    private SortedList<int,int> valuesIWantInSecondColumn 

    Public int PropertyOfAnItemInAList { 

     return valuesIWantInSecondColumn[currentID]; 
    } 
+0

我不知道我理解你的問題。你只是尋找最好的方法來將MyID放入Header1頭部的列中? –

+0

我重讀了它,現在認爲您試圖將「Header2」列綁定到不同的屬性,具體取決於在另一個控件中選擇了哪個項目,並且您通過使用具有返回特定屬性的開關(CurrentID)語句的另一個屬性來完成此操作案件。這是否準確?你可以顯示theObject的相關代碼嗎? –

+0

李 - 這是非常正確的。我將在編輯中添加相關代碼以解決問題。 –

回答

2

我會從對象中刪除CurrentID屬性。我不想在我的域對象中擁有UI屬性。我認爲最好的解決方案是對該列使用多重綁定,並從ViewModel中爲其分配SortedList和MyID值,使用轉換器從排序後的列表中返回選定的項目。事情是這樣的(假設上市組合框以及):

<ComboBox Grid.Column="0" ItemsSource="{Binding Ids}" SelectedItem="{Binding MyID}" /> 
    <ListView Name="Listview1" Grid.Column="1" ItemsSource="{Binding ObjectList}"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="Header1" DisplayMemberBinding="{Binding subObject.property}"/> 
       <GridViewColumn Header="Header2" > 
        <GridViewColumn.DisplayMemberBinding> 
         <MultiBinding Converter="{StaticResource IDictionarySelector}"> 
          <Binding Path="PropertyOfAnItemInAList" /> 
          <Binding Path="DataContext.MyID" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" /> 
         </MultiBinding> 
        </GridViewColumn.DisplayMemberBinding> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 
    </ListView> 

我測試此代碼,不得不添加的ToString()調用的返回,否則這是給我一個綁定錯誤的文本塊所需的字符串值(感謝Snoop):

public class IDictionarySelector : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (values != null && values.Length == 2) 
     { 
      IDictionary idictionary = values[0] as IDictionary; 
      int? key = values[1] as int?; 

      if ((idictionary != null) && (key != null) && (idictionary.Contains(key))) 
      { 
       return idictionary[key].ToString(); 
      } 
     } 

     return null; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

謝謝你。 (+1)我會試試這個。我還會看看下面的Sheridan的評論,看看它是否值得加入。我認爲謝里登也是一個很好的觀點。如果解決了,我會將其標記爲答案。 –

+0

這工作得很好。謝謝。 –

0

你只需要實現性能的INotifyPropertyChanged InterfaceObjectInObjectList類。特別是,你需要告訴界面,當CurrentID性質已經改變了PropertyOfAnItemInAList性質發生了變化:

public int CurrentID 
{ 
    get { return currentID; } 
    set 
    { 
     currentID = value; 
     NotifyPropertyChanged("CurrentID"); 
     NotifyPropertyChanged("PropertyOfAnItemInAList"); 
    } 
} 

該通知各CurrentID屬性更改時將更新UI的PropertyOfAnItemInAList屬性,所以你不要不需要任何特殊的Binding

+0

我明白你在駕駛什麼,但這不是我要找的。填充ListView的對象位於列表中,並且每個對象都有一個必須根據父元素屬性選擇的元素子列表。 ... –

+0

......想想這樣:診所裏的兩套記錄。第一組記錄是醫生,每個記錄都執行專門的服務。第二組是病人。每名醫生有多名患者,每名患者可以有多名醫生。假設我們希望列表視圖顯示醫生的患者以及每位患者訪問醫生的次數。因此,在這種情況下,我們在對象內部列出的是患者的ID號碼作爲密鑰的整數,值是他們訪問的次數。 –

+1

你只是讓你的生活變得那麼複雜。如果您使用分層數據爲業務規則建模,它將大大簡化您的用戶界面。我的意思是有一個「醫生」對象和一個「患者」對象......「醫生」有一個「ObservableCollection 」和一個「患者」將有一個「ObservableCollection 」等。使用WPF和MVVM,在用戶界面*中提供所有您需要的數據總是最簡單的。 – Sheridan