问题
In a UWP application, i have a Listview with a datatemplate. The ListView is binded via ItemsSource to an ObservableCollection of my model.
<ListView SelectionMode="None"
ItemTemplate="{StaticResource MydataTemplate}"
ItemsSource="{Binding Meals, Mode=OneWay}"
Meals is the ObservableCollection of model Meal :
public class Meal
{
public string restaurantId { get; set; }
public double price { get; set; }
public int Quantity { get; set; } = 0;
}
Inside ListView DataTemplate, i have a User Control (each element of the ListView have this User control). I want to bind the current meal quantity (Quantity property) to a dependency proeprty of the User control :
<DataTemplate x:Key="mydataTemplate">
...
<ccontrol:MyUC Value="{Binding Quantity, Mode=TwoWay}" Grid.Column="2" />
...
</DataTemplate>
With User control DP :
public sealed partial class MyUC : UserControl
{
public MyUC()
{
this.InitializeComponent();
this.DataContext = this;
}
public int Value
{
get { return (int)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
// Using a DependencyProperty as the backing store for Value. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(int), typeof(ResaNumUpDown), new PropertyMetadata(0));
But at runtime i have a binding expression error :
Error: BindingExpression path error: 'Quantity' property not found on 'Project.MyUC'
It search on UserControl, but i want to search Quantity property in DataTemplate data context.
I red this post who doesn't help me a lot.
Thanks in advance,
Regards
回答1:
Do not explicitly set a UserControl's DataContext
, like you do in the MyUC
constructor. Doing so prevents inheriting the DataContext from the parent control of the UserControl.
public MyUC()
{
this.InitializeComponent();
// this.DataContext = this; // remove this line
}
A Binding like
<ccontrol:MyUC Value="{Binding Quantity}" />
expects a property Quantity
in the current (inherited) DataContext, which here is the current element in the ItemsSource
collection of the ListView. This won't work when you've explicitly set the DataContext
.
In the UserControl's XAML, write a Bindings such that it takes the UserControl as its source by specifying the Binding's ElementName
property:
<UserControl ... x:Name="self">
...
<TextBlock Text="{Binding Value, ElementName=self}" />
...
</UserControl>
来源:https://stackoverflow.com/questions/40978136/binding-datatemplates-datacontext-property-to-a-usercontrol-dependency-property