Привязать свойство внутри DataTemplateItem в ListBox к внешнему объекту в MainPage - PullRequest
0 голосов
/ 03 июня 2019

Я получил ListBox с DataTemplate, внутри DataTemplate Я получил еще ListBox, пытаясь связать его Visibility с другим объектом, который находится в XAML MainPage

:

<ListBox x:Name="RegistersListView" ItemsSource="{x:Bind registersList}">
    <ListBox.ItemTemplate>
        <DataTemplate x:DataType="structures:Register">
            <StackPanel>
                <ListBox x:Name="FieldsListView" ItemsSource="{x:Bind fields_list}" Visibility="{x:Bind SomeVisibilityObjectIMain}">
                    <ListBox.ItemTemplate>
                        <DataTemplate x:DataType="structures:Field">
                            <Button Content="{x:Bind name}"/>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

C #:

public sealed partial class HWTab : Page
{
    public ObservableCollection<Register> registersList = new ObservableCollection<Register>();

    public var SomeVisibilityObjectIMain;

    public HWTab()
    {
        InitializeComponent();
        InitData();
        this.DataContext = hwType;
    }

     ....
 }

Мне нужно каким-то образом привязаться к «SomeVisibilityObjectIMain», я пытался связать с ElementName или даже сделать объект статическим, но не смог добиться успеха.Мой связываемый объект более сложен, чем пример, приведенный здесь, но решение этого даст мне путь для решения.

1 Ответ

1 голос
/ 04 июня 2019

Вы можете использовать {Binding} вместо x:Bind.Таким образом, вы можете добавить x:Name="Page" на свою страницу и затем использовать это имя во внутренней привязке:

{Binding ElementName=Page, Path=MyProperty}

Чтобы {Binding} работал, однако, MyProperty должно быть фактически свойством.Из вашего примера кода (который использует var, который также недействителен) кажется, что это просто простое поле, поэтому вам понадобится что-то вроде:

public string MyProperty {get;set;}

Чтобы также получать PropertyChanged уведомления, вы будетенеобходимо добавить вспомогательное поле и вызвать событие PropertyChanged.

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

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