wpf, привязка данных к дочернему элементу другого usercontrol - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь связать Textblock ' Text свойство MainWindow с списком * элементов. Подсчитайте другого Usercontrol , и текстовый блок Mainwindow не смог прочитать значение источника привязки.

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

я знаю, что могу определить свойство в пользовательском контроле и сделать его доступным для других элементов каркаса (например, текстового блока) Mainwindow, а затем оно может быть связанным.

я просто не могу понять, почему сбой привязки к списку другого usercontrol. Любое предложение будет оценено.

ниже приведен пример, который я сделал для лучшего объяснения.

UserControl Xaml:

<UserControl x:Class="stackoverFlow.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:stackoverFlow"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <StackPanel>
        <ListBox x:Name="lbDemo">
            <ListBoxItem>
                <TextBlock Text="element 01"/>
            </ListBoxItem>
            <ListBoxItem>
                <TextBlock Text="element 02"/>
            </ListBoxItem>
            <ListBoxItem>
                <TextBlock Text="element 03"/>
            </ListBoxItem>

        </ListBox>
        <!--binding to the control of the same usercontrol is fine-->
        <TextBlock Text="{Binding ElementName=lbDemo,Path=Items.Count,StringFormat='there are {0} items in the listbox.'}"/>
    </StackPanel>
</UserControl>

MainWindow Xaml:

<Window x:Class="stackoverFlow.MainWindow"
        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"
        xmlns:local="clr-namespace:stackoverFlow"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <local:UserControl1 x:Name="userControlDemo"/>

        <Separator Margin="0 5 0 15"/>
        <!--binding failed-->
        <TextBlock Text="{Binding ElementName=userControlDemo,Path=lbDemo.Items.Count, StringFormat='there are  {0} items in the listbox of Usercontrol1'}"/>
    </StackPanel>
</Window>

1 Ответ

0 голосов
/ 19 апреля 2020

В вашем пользовательском элементе управления вы должны добавить аксессор get, подобный этому:

public int ListCount {
    get {
        return this.lbDemo.Items.Count;
    }
}

И в главном окне вы называете его так:

<TextBlock Text="{Binding ElementName=userControlDemo, Path=ListCount, StringFormat='there are  {0} items in the listbox of Usercontrol1'}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...