首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将用户控件属性绑定到可观察集合中包含的可观察对象的属性

如何将用户控件属性绑定到可观察集合中包含的可观察对象的属性
EN

Stack Overflow用户
提问于 2020-02-20 23:41:19
回答 1查看 872关注 0票数 0

我正在使用MVVMLight,需要能够在视图初始化期间对属性进行编程编辑--大约12个切换框。因为其中有很多,而且我想迭代链接的属性,所以我尝试使用一个包含要绑定到切换按钮属性的值的ObservableCollectionObservableObject。我不确定这是绑定问题还是从INotifyPropertyChanged继承的ObservableObject接口的不正确实现。

下面是包含我希望绑定到的属性的类:

代码语言:javascript
复制
public class CavitySelect : ObservableObject
{
    private string _Text;
    public string Text
    {
        get { return _Text; }
        set
        {
            _Text = value;
            RaisePropertyChanged("Text");
        }
    }
    private bool _Visible;
    public bool Visible
    {
        get { return _Visible; }
        set
        {
            _Visible = value;
            RaisePropertyChanged("Visible");
        }
    }
    private bool _Toggle;

    public bool Toggle
    {
        get { return _Toggle; }
        set
        {
            _Toggle = value;
            RaisePropertyChanged("Toggle");
        }
    }

    public CavitySelect()
    {
        Text = "";
        Visible = false;
        Toggle = false;
    }
}

下面是我的ObservableCollection的实例化

代码语言:javascript
复制
private ObservableCollection<CavitySelect> _CavTogglesProperties;
public ObservableCollection<CavitySelect> CavTogglesProperties
{
    get { return _CavTogglesProperties; }
    set
    {
        _CavTogglesProperties = value;
        RaisePropertyChanged("CavTogglesProperties");
    }
}

public MyViewModel()
{
    this.CavTogglesProperties = GetCavities();
}    

public ObservableCollection<CavitySelect> GetCavities()
{
    CavitySelect t11 = new CavitySelect();
    CavitySelect t12 = new CavitySelect();
    CavitySelect t13 = new CavitySelect();
    CavitySelect t14 = new CavitySelect();
    CavitySelect t15 = new CavitySelect();
    CavitySelect t16 = new CavitySelect();
    CavitySelect t26 = new CavitySelect();
    CavitySelect t21 = new CavitySelect();
    CavitySelect t22 = new CavitySelect();
    CavitySelect t23 = new CavitySelect();
    CavitySelect t24 = new CavitySelect();
    CavitySelect t25 = new CavitySelect();
    ObservableCollection<CavitySelect> temp = new ObservableCollection<CavitySelect>() {t11,t12,t13,t14,t15,t16,t21,t22,t23,t24,t25,t26};
    return temp;
}

下面是我试图把它绑定起来的方法:

代码语言:javascript
复制
<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVisibilty"/>
</Window.Resources>
<Grid Background="#FFF4F4F5" Margin="8,165,8,8"  DataContext="{Binding CavTogglesProperties}">
    <ToggleButton DataContext="{Binding t11}" Content="{Binding Text}" IsChecked="{Binding Toggle}" Visibility="{Binding Visible,Converter={StaticResource BoolToVisibilty}}"/> 
</Grid>

我已经确认了视图与ViewModel类的绑定正在正常工作。我还尝试过不首先设置包含网格的DataContext而进行绑定,例如:

代码语言:javascript
复制
<ToggleButton DataContext="{Binding CavTogglesProperties[t11]}" ... />

需要澄清的是:每个CavitySelect项都与GridView中的一个切换按钮相关,属性将根据未显示的输入进行初始化。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-21 02:09:55

显示项的集合

您的问题并不十分清楚,但我相信您希望在UI中显示一个项目列表;但是,按照目前的实现,XAML的结构实际上是显示单个项。

要显示一个列表,您需要查看各种集合视图(例如,ListViewGridView等)。

例如:

代码语言:javascript
复制
<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVisibilty"/>
</Window.Resources>
<Grid Background="#FFF4F4F5" Margin="8,165,8,8">
  <ListView ItemsSource="{Binding CavTogglesProperties}">
    <ListView.ItemTemplate>
      <DataTemplate>
        <ToggleButton Content="{Binding Text}" IsChecked="{Binding Toggle}" />
      </DataTemplate>
    </ListView.ItemTemplate>
  </ListView>
</Grid>

若要仅显示特定项,应在ViewModel中筛选列表,而不是绑定可见性。如果可见项在显示时没有改变,只需在填充列表时过滤它。

但是,如果可见性会发生变化,并且您希望视图能够反映这些更改,那么请查看如何为项源实现一个过滤器,如在这个问题中所解释的:如何在WPF中过滤ListView?

由于您已经在使用ObservableCollection和ObservableObject,所以一切都应该自动更新。

显示集合中的单个项

如果我读错了你的问题,你想知道如何从一个集合中显示一个项目,有几种不同的方法来处理这个问题:

  1. 将单个项公开为ViewModel上的属性,这样视图就不必深入到列表中。
  2. 创建一个接受集合和索引的转换器,然后提取正确的项。

但是,我强烈建议使用选项1,因为它最符合MVVM,可以生成最干净和最可测试的代码。

例如:

代码语言:javascript
复制
private ObservableCollection<CavitySelect> _CavTogglesProperties;
public ObservableCollection<CavitySelect> CavTogglesProperties
{
    get { return _CavTogglesProperties; }
    set
    {
        _CavTogglesProperties = value;
        RaisePropertyChanged("CavTogglesProperties");
    }
}

private CavitySelect _SpecificCavToggle;
public CavitySelect SpecificCavToggle
{
    get { return _SpecificCavToggle; }
    set
    {
        _SpecificCavToggle= value;
        RaisePropertyChanged("SpecificCavToggle");
    }
}

public MyViewModel()
{
    this.CavTogglesProperties = GetCavities();
    this.SpecificCavToggle = this.CavTogglesProperties[0];
}    

public ObservableCollection<CavitySelect> GetCavities()
{
    CavitySelect t11 = new CavitySelect();
    CavitySelect t12 = new CavitySelect();
    CavitySelect t13 = new CavitySelect();
    CavitySelect t14 = new CavitySelect();
    CavitySelect t15 = new CavitySelect();
    CavitySelect t16 = new CavitySelect();
    CavitySelect t26 = new CavitySelect();
    CavitySelect t21 = new CavitySelect();
    CavitySelect t22 = new CavitySelect();
    CavitySelect t23 = new CavitySelect();
    CavitySelect t24 = new CavitySelect();
    CavitySelect t25 = new CavitySelect();
    ObservableCollection<CavitySelect> temp = new ObservableCollection<CavitySelect>() {t11,t12,t13,t14,t15,t16,t21,t22,t23,t24,t25,t26};
    return temp;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60330172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档