Как привязать данные к пользовательскому элементу управления с помощью селектора шаблонов - PullRequest
1 голос
/ 11 августа 2011

Я использую селектор шаблонов для сетки данных в WPF.

У меня есть этот код:

    <l:ProblemTemplateSelector x:Key="problemTemplateSelector">
        <l:ProblemTemplateSelector.ArithmeticTemplate>
            <DataTemplate>
                <Grid Background="LightBlue">
                    <l:ArithmeticUserControl Problem="{Binding ElementName=this}" />
                </Grid>
            </DataTemplate>
        </l:ProblemTemplateSelector.ArithmeticTemplate>
    </l:ProblemTemplateSelector>

В usercontrol мне нужно установить в свойстве Problem все элементы, но я не знаю, что я делаю неправильно. Спасибо.

ОБНОВЛЕНИЕ 1:

Я собираюсь быть более конкретным, если вам нужны подробности, у меня есть класс Упражнение, где находится пользовательский элемент управления:

public class Exercise : UserControl
{
    public static readonly DependencyProperty ProblemProperty = DependencyProperty.Register(
        "Problem", typeof(Problem), typeof(Exercise), new PropertyMetadata(null, ));

    public virtual Problem Problem
    {
        get
        {
            return (Problem)GetValue(ProblemProperty);
        }
        set
        {
            SetValue(ProblemProperty, value);
        }
    }
}

У меня есть еще один класс, полученный из упражнения.

public partial class ArithmeticUserControl : Exercise
{
    public ArithmeticUserControl()
    {
        InitializeComponent();
    }

    public override Problem Problem
    {
        get 
        { 
             return base.Problem;
        }
          set 
        { 
            base.Problem = value;

            Arithmetic p = (Arithmetic)value;
            Number1 = p.Number1;
            Number2 = p.Number2;
            Operator = p.Operation;
        }
     }
}

Ответы [ 2 ]

2 голосов
/ 11 августа 2011

Вы должны просто иметь возможность объявить привязку как "{Binding}" и сделать так, чтобы она связывала свойство Problem с элементом данных.

РЕДАКТИРОВАТЬ: После просмотра вашего примера вынужно изменить способ обработки свойства Problem.Система привязки WPF не использует свойства CLR, поэтому свойства CLR существуют только для удобства пользователя.Из-за этого код в вашем свойстве никогда не выполняется, когда значение задается с помощью привязки.

Вместо этого вам нужно обрабатывать изменения значения свойства путем переопределения OnPropertyChanged.Например, в вашем унаследованном классе:

protected override OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
    if(e.Property == ProblemProperty)
    {
        Arithmetic p = (Arithmetic)Problem;
        Number1 = p.Number1;
        Number2 = p.Number2;
        Operator = p.Operation;
    }
}
1 голос
/ 11 августа 2011

Просто используйте {Binding} для передачи элемента данных в элемент управления. Если это не поможет, вместе с вашим элементом управления добавьте TextBlock и посмотрите, что связано через прямое связывание:

<Grid Background="LightBlue">                     
   <l:ArithmeticUserControl Problem="{Binding ElementName=this}" />                 
   <TextBlock Text="{Binding}" Background="Green" ></TextBlock>
</Grid> 

Так что на зеленом фоне вы должны увидеть, что пришло в ListBoxItem

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...