2014-04-11 64 views
1

仍然在使用web/MVC中的背景來處理WPF。我已經實現了一些在UI場景中很常見的東西,重複的項目列表以及一些控件,以允許用戶對這些項目執行操作(我省略了一些綁定,因爲它們是長的relativeSource指令,它們是無關的問題):WPF MVVM - 重複組合框,將selectedItem傳遞給參數

<ItemsControl ItemsSource="{Binding Counts}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <ComboBox ItemsSource="{}" DisplayMemberPath="Description"></ComboBox> 
       <Button Command="{}" Content="Add></Button> 
       <TextBlock VerticalAlignment="Center"> 
        <Run Text="{Binding Path=Date, StringFormat=dd/MM/yyyy}"></Run> 
        <Run Text=" - "></Run> 
        <Run Text="{Binding Name}"></Run> 
       </TextBlock> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

正如你所看到的,組合框沒有實現的SelectedValue或SelectedValuePath - 它真的不能綁定到一個ViewModel屬性,因爲它是重複計數中的每個項目。所以目前它只是列出了可能的值。

Button命令綁定回ViewModel上的命令。然而,爲了做按鈕上的任何事情,我需要將參數傳遞到命令中 - 即Button綁定到的項目的ID,以及用戶在與此按鈕配對的特定ComboBox中選擇的任何內容。

ID很簡單 - 我可以爲它綁定一個CommandParameter。但是,如何將選定的ComboBox ID傳遞給該函數,以及如何確保它是來自成對ComboBox的ID?

編輯:稍微進一步的研究表明,雖然傳遞一個CommandParameter是直截了當,傳遞兩個不是。我看到涉及轉換器的答案,但在這種情況下,我的兩個參數來自不同的來源,所以我不能這樣做。幫助如何通過這兩個也將不勝感激。

+1

您是否嘗試過ElementName綁定? – user3455395

+0

不,我推測它會失敗,因爲ComboBox在ItemsControl中,所以每個ComboBox都具有相同的Name屬性。情況並非如此嗎? –

+1

有一個命名範圍的概念,名稱必須是唯一的,因爲它的命名範圍。 – user3455395

回答

1

下面介紹如何傳遞來自任意來源的多個值 - 您可以採用與用於補償丟失的MultiBinding(繼電器)相同的方法。這個想法非常簡單 - 創建一個合成的FrameworkElement(這裏是FE),它將作爲約束門面,我會選擇一個輕量級 - 例如TextBlock

使用MultiBindingConverter將其Tag屬性綁定到您的多個位置,單個腿將綁定到單個ElementNames。轉換器將簡單打包來自多個源的值並返回它 - 它可以是逗號分隔的字符串,它可以是一個對象,由您決定。轉換器的返回將明顯保存在您的門面的Tag屬性FE

最終綁定到門面FE使用ElementName作爲源和Tag作爲路徑。

+0

感謝您的幫助 - 非常感謝。我嘗試過這種方法,它們都是直接與CommandParameter進行多重綁定,以及使用標籤作爲外觀的建議。然而,在這兩種情況下,當轉換器似乎返回正確的對象[]值時,到達命令函數時,它只是一個空數組。編輯 - 哈哈,在這裏的解決方案:http://stackoverflow.com/questions/13713814/wpf-commandparameter-multibinding-values-null –

+0

可能是因爲扭曲的綁定或所以 - 應該在SL中工作罰款使用countelss次數 – user3455395

0

一種方法是將組合框雙向綁定到counts集合中對象類的屬性。然後,您在組合中所做的選擇將直接改變適當的對象,然後在單擊按鈕時不需要手動檢測/進行這些更改。

現在,您的counts集合的類型可能不支持,因此您可以創建一個類,添加這些額外的屬性並將其用於集合中。然後您的按鈕將在counts集合上運行,以根據需要創建/更改數據。

+0

事情是收集物品甚至沒有包含虛擬機,他們通常是一個模型的集合,爲模型實現INotifyPropertyChanged聽起來不像是一個非常好的主意。 – user3455395

+0

不知道我關注。我使用了類似的方法,我有一個模型類的ObservableCollection。然後將該集合設置爲某個控件的ItemSource,例如DataGrid,然後將控件綁定到該模型類的屬性。因此,網格中每一行的每一列都有一些方法來改變該特定模型對象的值。該按鈕本身綁定到虛擬機上的一個命令(該集合是其屬性),並允許您按照自己的意願保存或重新設置集合。 – Mashton