usercontrol中itemsControl的WPF数据绑定问题

时间:2011-01-25 23:51:05

标签: wpf data-binding user-controls itemscontrol

我有两个类和一个用户控件。

class pvalue
{
    public string value;
    public bool selected;
    public pvalue(string v, bool s)
    {
        value = v;
        selected = s;
    }
}

class param
{
    public string name { get; set; }
    public string prefix { get; set; }
    public IList<pvalue> values { get; set; }   

    public param(string _name, string _prefix, IList<pvalue> _values)
    {
        name = _name;
        prefix = _prefix;
        values = _values;
    }
}


<UserControl DataContext="{Binding param}" >
 <Grid>...
    <ItemsControl x:Name="itemctl" ItemsSource="{Binding Path=values}">
    ...
       <ItemsControl.ItemTemplate>
             <DataTemplate>
                <ToggleButton IsChecked="{Binding Path=selected}">
                    <TextBlock Text="{Binding Path=value}" />
                </ToggleButton>
            </DataTemplate>               
        </ItemsControl.ItemTemplate>
    </ItemsControl>
 </Grid>
</UserControl>

我的目的是在应用程序中创建类,并将其设置为usercontrol的datacontext。但我对WPF很新,这有点过头了。数据绑定无效 - “'对象'''pvalue'上找不到BindingExpression路径错误:'value'属性。”

我可以帮助理清用户控件的数据绑定吗?非常感谢。

2 个答案:

答案 0 :(得分:0)

这里似乎有一些问题:

  • 您应该绑定到属性(使用getter和setter)而不是字段,因此请将公共字段更改为pvalue类型的属性。
  • 如果您希望在更改这些属性值时更新UI,请查看在您的pvalue和param类型上实现INotifyPropertyChanged
  • 我会使用PascalCase作为您的类名和属性
  • 从参数名称中删除下划线
  • 使您的pvalue参数名称更具描述性
  • 您正在将UserControl的DataContext绑定到类似名称(param)的内容,您是如何让usercontrol获取您的param类型的实例?通常,您可以将此作为usercontrol的依赖项属性执行,然后在使用该控件时,可以将usercontrol的Param依赖项属性绑定到在当前DataContext上返回param类型实例的属性(通常是ViewModel,如果使用MVVM)

答案 1 :(得分:0)

在UserControl定义中包含您的解决方案命名空间,然后将该类作为资源包含在这样的资源中

<UserControl.Resources> <param:SolutionName x:key="Param" /> </UserControl.Resources>

然后修改您的代码,如下所示

<UserControl DataContext="{Binding param}" > <Grid>... <ItemsControl x:Name="itemctl" ItemsSource="{Binding Source="{StaticResource Param}"> ... <ItemsControl.ItemTemplate> <DataTemplate> <ToggleButton IsChecked="{Binding Path=selected}"> <TextBlock Text="{Binding Path=value}" /> </ToggleButton> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl> </Grid> </UserControl>

希望有所帮助