Windows Phone 10 Xaml ListView.ItemTemplate, связывающий свойство объекта usercontrol - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь использовать пользовательский элемент управления в 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 Ответ

0 голосов
/ 27 апреля 2018

Есть некоторые проблемы, которые нужно исправить. Прежде всего вы должны привязать элементы из вашей 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>

Надеюсь, это поможет. Не стейсняйся спросить. Я не запускал этот код, поэтому проверьте синтаксис, но идея есть. Кристоф

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