繁体   English   中英

带有“刷新”条目的组合框

[英]ComboBox with “Refresh” Entry

我在项目中遇到以下情况,我想知道实现目标的最佳方法是什么。

目标:拥有一个带有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>

如果Projects是具有项目枚举的依赖项属性,则还可以使用带有refresh命令(ICommand)的另一个依赖项属性。

我的ComboBox 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>

问题是Command找不到绑定的来源,所以问题是我是在做正确的方法并且找到解决方案,还是我在做错了方法(这会更好吗?)。

当然,我可以在组合框旁边添加一个按钮,但我想在组合框中添加按钮。 :)

顺便说一句:我正在尝试遵循MVVM模式。

我过去通过使用后面的代码解决了这个问题。 加载组合框后,创建一个新的Projects List<objects>并将Refresh string (也许是"<Refresh...>" )添加到列表中,最后将ItemsSource设置到该列表中。 使用模板选择器显示适当的DataTemplate。 选择更改后,请检查是否选择了“ Refresh string ,如果是,请刷新并重新加载组合框。 刷新时,可以尝试将选择设置回先前选择的项目或索引0,这样用户永远不会在组合框中选择“刷新”。

一些片段来演示。

在ctor

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

您有主意...如果此解决方案满足您的需求,这应该足以使您继续前进。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM