привязать текстовый блок к текущему элементу списка в чистом xaml - PullRequest
2 голосов
/ 02 февраля 2012

У меня есть некоторые данные, сохраненные в файле XML.Они будут отображены в списке.Теперь, когда я изменяю список Selectedindex, я хотел бы обновить другую информацию в текстовом блоке на основе выбранного индекса.

есть ли способ сделать это в чистом xaml?если нет, как бы я связал текстовый блок с выбранным элементом в списке?

РЕДАКТИРОВАТЬ: Как бы я перемещаться по данным без использования списка?я имею в виду использование кнопки для перехода к следующему элементу и другую кнопку для перемещения назад .. !!

любая помощь действительно приветствуется ..

<Window x:Class="WpfSingleInstance.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
    <StackPanel
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Cornsilk">

        <StackPanel.Resources>
            <XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books">
                <x:XData>
                    <Inventory xmlns="">
                        <Books>
                            <Book ISBN="0-7356-0562-9" Stock="in" Number="9">
                                <Title>XML in Action</Title>
                                <Summary>XML Web Technology</Summary>
                            </Book>
                            <Book ISBN="0-7356-1370-2" Stock="in" Number="8">
                                <Title>Programming Microsoft Windows With C#</Title>
                                <Summary>C# Programming using the .NET Framework</Summary>
                            </Book>
                            <Book ISBN="0-7356-1288-9" Stock="out" Number="7">
                                <Title>Inside C#</Title>
                                <Summary>C# Language Programming</Summary>
                            </Book>
                        </Books>
                    </Inventory>
                </x:XData>
            </XmlDataProvider>
        </StackPanel.Resources>

        <TextBlock FontSize="18" FontWeight="Bold" Margin="10"
HorizontalAlignment="Center">XML Data Source Sample</TextBlock>
        <ListBox
Width="265" Height="98" x:Name="lbox" Background="Honeydew" IsSynchronizedWithCurrentItem="True">
            <ListBox.ItemsSource>
                <Binding Source="{StaticResource InventoryData}"
           XPath="*[@Stock='out'] | *[@Number>=8 or @Number=3]"/>
            </ListBox.ItemsSource>

            <ListBox.ItemTemplate>

                <DataTemplate>
                    <TextBlock FontSize="12" Foreground="Red">
      <TextBlock.Text>
        <Binding XPath="Title"/>
      </TextBlock.Text>
                    </TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

        <StackPanel DataContext="{StaticResource InventoryData}">
            <TextBlock Text="{Binding  XPath=Book/Title}"/>
            <TextBox Margin="5,31,98,10" x:Name="textBoxMainDetail" Text="{Binding XPath=Book/Summary}" />
        </StackPanel>
    </StackPanel>



</Grid>

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

Вам необходимо установить SelectedValuePath в качестве «Заголовка» для вашего списка.Затем просто свяжите ваш textBlock с selectedValue вашего списка, используя elementName, как это -

<ListBox Width="265" Height="98" x:Name="lbox" Background="Honeydew"
                     IsSynchronizedWithCurrentItem="True" SelectedValuePath="Title">
            </ListBox>
            <StackPanel DataContext="{StaticResource InventoryData}">
                <TextBlock Text="{Binding Path=SelectedValue, ElementName=lbox}"/>
                <TextBox Margin="5,31,98,10" x:Name="textBoxMainDetail" Text="{Binding XPath=Book/Summary}" />
            </StackPanel>
        </StackPanel>
2 голосов
/ 02 февраля 2012

Вы можете связать так:

<TextBox Text="{Binding ElementName=lbox, Path=SelectedItem[Title].InnerText}" />

SelectedItem является XmlElement .

РЕДАКТИРОВАТЬ: Вот пример кода, как получить доступ к данным XmlDataProvider в коде позади и применить его как DataContent для TextBox.

Измените привязку TextBox.Text следующим образом:

<TextBox x:Name="textBoxMainDetail" Text="{Binding Path=[Title].InnerText}" />

В коде позади получите данные XML из XmlDataProvider и установите DataContext из TextBox:

XmlDataProvider dataProvider = (XmlDataProvider)stackPanel.Resources["InventoryData"];
XmlElement books = (XmlElement)dataProvider.Document.SelectNodes(dataProvider.XPath)[0];

// set DataContext to an item from the child node collection
textBoxMainDetail.DataContext = books.ChildNodes[0];

Обратите внимание, что StackPanel с XmlDataProvider в его словаре ресурсов теперь получил имя. Если этот код должен выполняться во время инициализации приложения (например, в конструкторе Window), для свойства XmlDataProvider.IsAsynchronous должно быть установлено значение false.

Теперь у вас должна быть возможность изменить DataContext на другой проиндексированный элемент коллекции книг в обработчике нажатий кнопок.

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