Проблема привязки данных WPF для itemsControl в usercontrol - PullRequest
0 голосов
/ 26 января 2011

У меня есть два класса и пользовательский контроль.

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>

Мое намерение состоит в том, чтобы создать класс в приложении и установить его в качестве datacontext пользовательского контроля.Но я очень новичок в WPF, это немного над моей головой.Привязка данных не работает - "Ошибка пути BindingExpression: свойство 'value' не найдено в 'object' '' pvalue '".

Могу ли я получить некоторую помощь, чтобы разобраться с привязкой данных для usercontrol?Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 26 января 2011

Включите ваше пространство имен решения в определение 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><br> </ItemsControl.ItemTemplate> </ItemsControl> </Grid> </UserControl>

Надеюсь, это поможет

0 голосов
/ 26 января 2011

Кажется, здесь есть несколько неправильных вещей:

  • Вы должны привязываться к свойствам (с геттерами и сеттерами), а не к полям, поэтому измените ваши открытые поля на свойства типа pvalue.
  • Если вы хотите, чтобы пользовательский интерфейс обновлялся при изменении значений этих свойств, обратите внимание на реализацию INotifyPropertyChanged для ваших типов значений и параметров
  • Я бы использовал PascalCase для имен и свойств вашего класса
  • Удалить подчеркивания из имен ваших параметров
  • Сделать имена параметров pvalue более наглядными
  • Вы связываете DataContext из UserControl с тем, что похоже на имя типа (param), каквы намерены usercontrol получить экземпляр вашего типа param?Обычно вы можете сделать это как свойство зависимостей вашего usercontrol, затем, когда вы используете этот элемент управления, вы можете привязать свойство зависимостей Param вашего usercontrol к свойству, возвращающему экземпляр вашего типа param в ваш текущий DataContext (обычно ViewModel, еслииспользуя MVVM)
...