В этом руководстве используется встроенный 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
?