Wpf Comboxbox 可选默认项

发布于 2024-11-03 01:19:57 字数 958 浏览 1 评论 0 原文

我有一个组合框,它从我的视图模型数据绑定到可观察集合。我可以让我的列表填充数据,但我还想添加一个默认项目,例如“--All Models--”。下面的代码将“--All Models--”显示为默认项目,但如果您选择其他项目,则该项目不可选。

<ContentControl Content="{Binding Items}">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <Grid>
                <ComboBox x:Name="cb" ItemsSource="{Binding}"/>
                <TextBlock x:Name="tb" Text="--Choose One--" IsHitTestVisible="False" Visibility="Hidden"/>
            </Grid>
            <DataTemplate.Triggers>
                <Trigger SourceName="cb" Property="SelectedItem" Value="{x:Null}">
                    <Setter TargetName="tb" Property="Visibility" Value="Visible"/>
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>

我尝试过使用复合集合,但这似乎不起作用。有办法做到这一点吗?

提前致谢!

I have a comboxbox that is databound to an observablecollection from my viewmodel. I can get my list to populate with the data but I also would like to add a default item like "--All Models--". The code below displays "--All Models--" as the default item but it is not selectable if you select another item.

<ContentControl Content="{Binding Items}">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <Grid>
                <ComboBox x:Name="cb" ItemsSource="{Binding}"/>
                <TextBlock x:Name="tb" Text="--Choose One--" IsHitTestVisible="False" Visibility="Hidden"/>
            </Grid>
            <DataTemplate.Triggers>
                <Trigger SourceName="cb" Property="SelectedItem" Value="{x:Null}">
                    <Setter TargetName="tb" Property="Visibility" Value="Visible"/>
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>

I have tried with a compositecollection but that does not seem to to work. Is there a way to accomplish this?

Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

2024-11-10 01:19:57

CompositeCollection 应该可以工作,如果你知道如何使用它的话;它的一个重要的事情是它继承DataContext,这意味着您需要以某种其他方式引用您的源,如果该方法是x :Reference 您不能创建循环引用,可以通过将集合放置在所引用元素的资源中来避免这种情况。例如

<Window.Resources>
    <CompositeCollection x:Key="compCollection">
        <ComboBoxItem Content="-- All Models --"/>
        <CollectionContainer Collection="{Binding MyCollection, Source={x:Reference Window}}"/>
    </CompositeCollection>
    ...
</Window.Resources>

,您可以通过 ItemsSource="{StaticResource compCollection}" 使用它。

CompositeCollection should work, if you know how to use it that is; one important thing about it is that it does not inherit a DataContext, this means you need to reference your source in some other manner, further if that method is x:Reference you may not create a cyclic reference, this can be avoided by placing the collection in the Resources of the element referenced. e.g.

<Window.Resources>
    <CompositeCollection x:Key="compCollection">
        <ComboBoxItem Content="-- All Models --"/>
        <CollectionContainer Collection="{Binding MyCollection, Source={x:Reference Window}}"/>
    </CompositeCollection>
    ...
</Window.Resources>

You can then just use this via ItemsSource="{StaticResource compCollection}".

扛起拖把扫天下 2024-11-10 01:19:57

将视图交互逻辑构建到视图模型中。我的建议是让 Observable 集合类型为由源列表填充的视图模型,再加上一个用于“未选择”项目的视图模型。

然后

public class ItemViewModel
{
     public string Description { get; set; }
     public int Id { get; set; }
}

public class ViewModel : ViewModelBase
{        
    public ObservableCollection<ItemViewModel> Items { get; set; } // Bound to ContentControl

    private void Init()
    {
        Items = new ObservableCollection<ItemViewModel>();
        Items.Add(new ItemViewModel() { Description = "--choice one--" , Id = null });
        Items.AddRange(Model.Items.Select(i=> new ItemViewModel() { Description = i.Description , Id = i.Id }));
    }
}

您可以使用空语义处理 SelectedItem 的 Id 。

Build the view interaction logic into the viewmodel. my suggestion make the Observable collection type a viewmodel that is populated by the source list, plus one more viewmodel for the "not selected" item.

something like

public class ItemViewModel
{
     public string Description { get; set; }
     public int Id { get; set; }
}

public class ViewModel : ViewModelBase
{        
    public ObservableCollection<ItemViewModel> Items { get; set; } // Bound to ContentControl

    private void Init()
    {
        Items = new ObservableCollection<ItemViewModel>();
        Items.Add(new ItemViewModel() { Description = "--choice one--" , Id = null });
        Items.AddRange(Model.Items.Select(i=> new ItemViewModel() { Description = i.Description , Id = i.Id }));
    }
}

Then you can process SelectedItem's Id with the null sematic.

把人绕傻吧 2024-11-10 01:19:57

您可以将集合通用类型更改为 object 并在其中添加 --All Models-- 事物。

You can change your collection generic type to object and add there --All Models-- thing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文