Привязка данных не работает для UserControl, используемого в качестве DataTemplter в ItemsControl - PullRequest
0 голосов
/ 25 марта 2020

В этом руководстве используется встроенный XAML в качестве DataTemplate для ItemsControl. Я пытаюсь использовать пользовательский UserControl в качестве шаблона и получаю некоторые крипти c ошибки.

ModelPresenter

Items = new ObservableCollection<ExpandoModel> {
  new ExpandoModel { ["Value"] = 1 },
  new ExpandoModel { ["Value"] = 2 }
}

MainWindow.xaml

<ItemsControl ItemsSource="{ Binding Source={ StaticResource ModelPresenter }, Path=Items }">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <presenters:MyControl Item="{ Binding Path=Value }" />  // Issue #1 - runtime error about binding
      <presenters:MyControl Item="5" />                       // Issue #2 - Item has type "ExpandoModel", but should be just "double"
     </DataTemplate>
  </ItemsControl.ItemTemplate>
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <UniformGrid Columns="1" IsItemsHost="True" />
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
</ItemsControl>

MyControl.xaml

<Grid VerticalAlignment="Bottom">
  <TextBlock Text="{ Binding Value }" />   // Somehow works because DataContext = ExpandoModel, but I expect DataContext to be 5
  <TextBlock Text="{ Binding Item }" />    // Doesn't work, returns entire ExpandoModel instead of 5
</Grid>

MyControl.xaml.cs

public partial class MyControl : UserControl
{
  public MyControl()
  {
    InitializeComponent();
  }

  public static DependencyProperty ItemProperty = DependencyProperty.Register(
    "Item",
    typeof(double),
    typeof(MyControl));

  public static DependencyProperty ComplexItemProperty = DependencyProperty.Register(
    "ComplexItem",
    typeof(ExpandoModel),
    typeof(MyControl));

  public virtual double Item
  {
    get => (double) GetValue(ItemProperty);
    set => SetValue(ItemProperty, value);
  }

  public virtual ExpandoModel ComplexItem
  {
    get => ConversionManager.Value<ExpandoModel>(GetValue(ComplexItemProperty));
    set => SetValue(ComplexItemProperty, value);
  }
}

Issue # 1

Когда я пытаюсь передать какой-либо элемент из коллекции в мой пользовательский элемент управления с использованием привязки данных, я получаю эту ошибку.

XamlParseException: 
A 'Binding' cannot be set on the 'Item' property of type 'MyControl'. 
A 'Binding' can only be set on a DependencyProperty of a DependencyObject

Issue # 2

Попытался отладить проблему # 1, и вместо привязки данных я передаю значение stati c цифра c. Когда я пытаюсь использовать это значение числового значения c в пользовательском управлении, он думает, что я передал весь набор ExpandoModel из коллекции, хотя я ожидаю только числовое значение c.

Вопрос

Почему я не могу использовать динамическое связывание c как Item = "{ Binding Value }" в MainWindow.xaml и почему, когда я использую Item = "5", это свойство Это элемент ExpandoModel вместо 5?

...