Windows Phone 10 Xaml ListView.ItemTemplate, связывающий свойство объекта usercontrol
Я пытаюсь использовать пользовательский элемент управления в ListView.ItemTemplate. Этот пользовательский элемент управления имеет свойство объекта. Я не могу связать это свойство объекта. Я попробовал следующее, но выдает ошибку.
Мое требование заключается в том, что MyDataRowProperty должен быть привязан к каждому MyDataRow в списке, назначенном для listView.ItemsSource.
<ListView x:Name="listView" ItemsSource="{Binding}">
<ListView.ItemTemplate>
<DataTemplate>
<!--<Controls:DetailItemControl Height="105" Width="400" MyDataRowProperty="{Binding RelativeSource={RelativeSource Self}}"></Controls:DetailItemControl>-->
<Controls:DetailItemControl Height="105" Width="400" MyDataRowProperty="{Binding}"></Controls:DetailItemControl>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Код позади:
List<MyDataRow> rows = new List<MyDataRow>();
rows = GetData();
listView.ItemsSource = rows;
MyControl.xaml
<UserControl
x:Class="MyProject.Controls.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="110"
d:DesignWidth="400">
<Grid>
<TextBlock x:Name="tblDescription" />
</Grid>
</UserControl>
MyControl.xaml.cs:
private MyDataRow _MyDataRow;
public MyDataRowProperty MyDataRow
{
get { return _MyDataRow; }
set {
_MyDataRow = value;
if (_MyDataRow != null)
{
tblDescription.Text = _MyDataRow.Description
}
}
}
MyDataRow.cs
public class MyDataRow
{
public string Description { get; set; }
}
1 ответ
Есть некоторые проблемы, которые нужно исправить. Прежде всего вы должны привязать элементы из вашей ViewModel, а не из кода позади. В вашей ViewModel реализуйте интерфейс INotifyPropertyChanged. Это должно выглядеть так:
public class YourViewModel: INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection <MyDataRow> rows;
public ObservableCollection<MyDataRow> Rows
{
get {return rows;}
set {
Rows = value;
NotifyPropertyChanged("Rows");
}
}
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
....
}
В вашем компоненте вы должны создать свойство зависимости:
public string MyDataRow
{
get { return (string)GetValue(MyDataRowProperty); }
set { SetValue(MyDataRowProperty, value); }
}
public static readonly DependencyProperty MyDataRowProperty = DependencyProperty.Register("MyDataRow", typeof(string), typeof(MyControl));
После этого в коде вашего View задайте текстовый текст данных, затем вы можете связать его в xaml.
<ListView x:Name="listView" ItemsSource="{Binding Rows}">
<ListView.ItemTemplate>
<DataTemplate>
<Controls:DetailItemControl Height="105" Width="400" MyDataRow="{Binding Description}"></Controls:DetailItemControl>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Надеюсь это поможет. Не стейсняйся спросить. Я не запускал этот код, поэтому проверьте синтаксис, но идея есть. Kristof