Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将用户控件属性绑定到可观察集合中包含的可观察对象的属性_C#_Wpf_Mvvm_Mvvm Light_Observablecollection - Fatal编程技术网

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

C# 如何将用户控件属性绑定到可观察集合中包含的可观察对象的属性,c#,wpf,mvvm,mvvm-light,observablecollection,C#,Wpf,Mvvm,Mvvm Light,Observablecollection,我使用的是MVVMLight,需要能够在视图初始化期间对大约12个切换框的属性进行编程编辑。因为它们太多了,我想遍历链接的属性,所以我尝试使用ObservableCollection的ObservableCollection,其中包含要绑定到切换按钮属性的值。我不确定这是绑定问题还是继承自observegeObject的INotifyPropertyChanged接口的不正确实现 下面是包含我希望绑定到的属性的类: public-class-CavitySelect:observateObjec

我使用的是MVVMLight,需要能够在视图初始化期间对大约12个切换框的属性进行编程编辑。因为它们太多了,我想遍历链接的属性,所以我尝试使用
ObservableCollection
ObservableCollection
,其中包含要绑定到切换按钮属性的值。我不确定这是绑定问题还是继承自
observegeObject
INotifyPropertyChanged
接口的不正确实现

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

public-class-CavitySelect:observateObject
{
私有字符串_文本;
公共字符串文本
{
获取{return\u Text;}
设置
{
_文本=值;
RaisePropertyChanged(“文本”);
}
}
私人厕所可见;
公众视野
{
获取{return\u Visible;}
设置
{
_可见=价值;
RaisePropertyChanged(“可见”);
}
}
私有布尔开关;
公共布尔开关
{
获取{return\u Toggle;}
设置
{
_切换=值;
RaisePropertyChanged(“切换”);
}
}
公共腔选择()
{
Text=“”;
可见=假;
切换=假;
}
}
下面是my
ObservableCollection
的实例:

private observateCollection\u CavTogglesProperties;
公共可观察收集警告属性
{
获取{return\u CavTogglesProperties;}
设置
{
_CavTogglesProperties=值;
RaiseProperty已更改(“CavTogglesProperties”);
}
}
公共MyViewModel()
{
this.CavTogglesProperties=getCavests();
}    
公共可观测集合getDecepts()
{
CavitySelectT11=新的CavitySelect();
CavitySelectT12=新的CavitySelect();
CavitySelectT13=新的CavitySelect();
CavitySelectT14=新的CavitySelect();
CavitySelectT15=新的CavitySelect();
CavitySelectT16=新的CavitySelect();
CavitySelectT26=新的CavitySelect();
CavitySelect t21=新的CavitySelect();
CavitySelect t22=新的CavitySelect();
CavitySelect t23=新的CavitySelect();
CavitySelectT24=新的CavitySelect();
CavitySelect t25=新的CavitySelect();
ObservableCollection temp=新的ObservableCollection(){t11,t12,t13,t14,t15,t16,t21,t22,t23,t24,t25,t26};
返回温度;
}
以下是我试图将其绑定的方式:


我已经确认视图与ViewModel类的绑定工作正常。我还尝试了绑定,但没有先设置包含网格的
DataContext
,例如:


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

显示项目集合 您的问题并没有说得很清楚,但我相信您希望在UI中显示一个项目列表;然而,正如当前实现的那样,XAML的结构实际上是显示单个项

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

例如:

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

要仅显示特定项,应在ViewModel中过滤列表,而不是绑定可见性。如果显示时可见的项目没有更改,只需在填充列表时对其进行过滤即可

但是,如果可见性将发生更改,并且您希望视图反映这些更改,请查看为您的项目源实现筛选器,如本问题中所述:

因为您已经在使用ObservableCollection和ObservableObject,所以所有内容都应该自动更新

显示集合中的单个项目 如果我看错了你的问题,你想知道如何展示收藏中的单个项目,有几种不同的方法:

  • 将单个项作为ViewModel上的属性公开,以便视图不必深入列表
  • 创建一个包含集合和索引,然后提取正确项的
  • 不过,我强烈建议使用选项1,因为它最符合MVVM,生成最干净、最可测试的代码

    例如:

    <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>
    
    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;
    }
    
    private observateCollection\u CavTogglesProperties;
    公共可观察收集警告属性
    {
    获取{return\u CavTogglesProperties;}
    设置
    {
    _CavTogglesProperties=值;
    RaiseProperty已更改(“CavTogglesProperties”);
    }
    }
    专用腔选择专用腔切换;
    公共腔选择特定腔切换
    {
    获取{return}
    设置
    {
    _SpecificCavToggle=值;
    RaisePropertyChanged(“SpecificCavToggle”);
    }
    }
    公共MyViewModel()
    {
    this.CavTogglesProperties=getCavests();
    this.SpecificCavToggle=this.cavtogglesprroperties[0];
    }    
    公共可观测集合getDecepts()
    {
    CavitySelectT11=新的CavitySelect();
    CavitySelectT12=新的CavitySelect();
    CavitySelectT13=新的CavitySelect();
    CavitySelectT14=新的CavitySelect();
    CavitySelectT15=新的CavitySelect();
    CavitySelectT16=新的CavitySelect();
    CavitySelectT26=新的CavitySelect();
    CavitySelect t21=新的CavitySelect();
    CavitySelect t22=新的CavitySelect();
    CavitySelect t23=新的CavitySelect();
    CavitySelectT24=新的CavitySelect();
    CavitySelect t25=新的CavitySelect();
    ObservableCollection temp=新的ObservableCollection(){t11,t12,t13,t14,t15,t16,t21,t22,t23,t24,t25,t26};
    返回温度;
    }
    
    显示项目集合 你的问题不能使它成功