2016-01-20 66 views
1

我在我的項目中有以下情況,我想知道什麼是實現我的目標的最佳方式。組合框與「刷新」條目

目標:有一個帶有itemsource綁定的組合框和一個功能類似刷新按鈕(從數據庫獲取項目並更新組合框項目)的組合框。

目前我使用itemsource綁定(請參見下文)設置我的組合框,但目前我正忙於刷新命令的綁定。

的ItemsSource綁定:

<UserControl.Resources> 
<CollectionViewSource x:Key="ProjectSource" Source="{Binding Projects, ElementName=Ancestor}"/> 
    <CompositeCollection x:Key="ProjectCollection"> 
     <CollectionContainer Collection="{Binding Source={StaticResource ProjectSource}}"/> 
     <Button Content="Refresh!"/> 
    </CompositeCollection> 

</UserControl.Resources> 

如果項目是一個依賴屬性與項目的列舉,與刷新命令(一個ICommand)另一個依賴屬性也是可用的。定義爲

我的組合框IST如下:

<ComboBox SelectedValue="{Binding Project}" 
        ItemsSource="{StaticResource ProjectCollection}" 
        VerticalContentAlignment="Center" 
        HorizontalAlignment="Left" 
        Name="Box" 
        IsHitTestVisible="{Binding IsEditable}" 
        IsEnabled="{Binding IsEnabled, Mode=OneWay, IsAsync=True}"> 

      <ComboBox.Resources> 
       <DataTemplate DataType="{x:Type viewModels:ProjectViewModel}"> 
        <TextBlock Text="{Binding Name}"/> 
       </DataTemplate>> 
      </ComboBox.Resources> 

     </ComboBox> 

的問題是,命令無法找到綁定的源,所以這個問題是我是正確的方式做,有一個解決方案,還是我在錯誤的方式(這會更好?)。

當然,我可以在我的組合框旁邊添加一個按鈕,但我想在我的組合框中添加按鈕。 :)

btw .:我試圖按照MVVM模式。

+0

請記住,以上示例中沒有命令綁定,因爲它沒有工作。 :) – Thoor

+0

我很好奇的可用性。這是否意味着刷新項目總是在索引0?如果不是,如果您有大量項目,您的用戶需要在組合列表中找到它。 – tgpdyk

+0

@tgpdyk關於在我的情況下的可用性是沒有問題的,因爲只有當特定物品不在列表中時,每年約5次的情況下刷新纔是必要的。 – Thoor

回答

0

我已經通過使用後面的代碼解決了這個問題。加載組合框時,創建Projects的新List<objects>,並將Refresh string(可能爲"<Refresh...>")添加到列表中,最後將ItemsSource設置爲該列表。使用模板選擇器來顯示相應的DataTemplate。當選擇更改時,檢查是否選擇了Refresh string,如果是,請刷新並重新加載組合框。刷新時,可以嘗試將選擇設置回先前選擇的項目或索引0,以便用戶永遠不能在組合框中選擇「刷新」。

一些片段來演示。

在構造函數

SelectedProjectComboBoxTemplateSelector.StringTemplate = FindResource("StringTemplate") as DataTemplate; 
SelectedProjectComboBoxTemplateSelector.ProjectTemplate = FindResource("ProjectTemplate") as DataTemplate; 
SelectedProjectComboBox.SelectionChanged += SelectedProjectComboBox_SelectionChanged; 
SelectedProjectComboBox.ItemTemplateSelector = new SelectedProjectComboBoxTemplateSelector(); 

void SelectedProjectComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { 
    if (SelectedProjectComboBox.SelectedItem is string && ((string)SelectedProjectComboBox.SelectedItem) == RefreshProjectSelectionItem) { 
     object current = e.RemovedItems.Count > 0 ? e.RemovedItems[0] : null; 

     bool ret = RefreshData(); // from db 
     if (ret) { 
      LoadData(); // repopulate combobox 
     } else { 
      SelectedProjectComboBox.SelectedItem = current; 
     }    
    } 
} 

public class SelectedProjectComboBoxTemplateSelector : DataTemplateSelector { 
    public static DataTemplate StringTemplate { get; set; } 
    public static DataTemplate ProjectTemplate { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) { 
     if (item == null || Designer.IsInDesignMode) return null; 

     if (item is string) return StringTemplate; 
     if (item is Project) return ProjectTemplate; 

     return null; 
    } 
} 

你的想法

...這應該足以讓你去,如果這個解決方案能夠滿足您的需求。

+0

@Thoor,只是好奇,如果你找到了解決你的問題?上面的幫助,還是你使用另一種方法? –

+0

我將它標記爲答案,因爲它與我的解決方案非常相似。我結束了將ItemsSource綁定到我的ProjectViewModels列表。當我的列表被調用時,我返回項目列表和一個從ProjectViewModel繼承的RefreshViewModel。如果現在SelectedValue綁定更新,我檢查給定的類型並設置項目或刷新列表。 RefreshViewModels Equals方法被重寫並返回false,因此無法選擇。 – Thoor