Привязка к шаблонному элементу WPF Treeview - PullRequest
1 голос
/ 17 апреля 2011

У меня есть TreeView, контекст данных которого устанавливается с помощью

        LayoutRoot.DataContext = value

из-за кода.

CommandTreeViewModel имеет Commands свойство IEnumerable(Of CommandViewModel)

CommandViewModel в свою очередь имеет несколько детей CommandViewModel

В My XAML я конвертирую это в элементы дерева, используя следующий XAML

        <TreeView ItemsSource="{Binding}"
                  DataContext="{Binding FirstGeneration}"
                  x:Name="CommandTreeView">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                    <Border BorderThickness="1"
                            Width="200"
                            Margin="2"
                            CornerRadius="10,0,10,0">
                        <StackPanel Orientation="Horizontal"
                                <Image Source="{Binding Icon}"
                                       Width="24"
                                       Height="24" />
                            <TextBlock VerticalAlignment="Center"
                                       FontSize="13"
                                       Margin="10,0,0,0"
                                       Text="{Binding Name}"
                                       Foreground="White" />
                        </StackPanel>
                    </Border>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>

Теперь у меня есть изображение и два текстовых блока в другом месте, которые я хочу привязать к элементам в исходном источнике данных для выбранного элемента древовидной структуры - в частности, Icon, Description, Name. Я пытаюсь связать их, как показано ниже:

            <StackPanel Orientation="Vertical"
                DataContext="{Binding ElementName=CommandTreeView, Path=SelectedItem}">
                <Image x:Name="CommandIcon"
                       Width="64"
                       Height="64"
                       Source="{Binding XPath=@Icon}"></Image>
            </StackPanel>

и то же самое со свойством Text TextBlocks.

Я получаю следующее исключение в окне вывода, когда нажимаю на элемент в виде дерева ...

System.Windows.Data Error: 44 : BindingExpression with XPath cannot bind to non-XML object.; XPath='@Icon' BindingExpression:Path=/InnerText; DataItem='CommandViewModel' (HashCode=39320280); target element is 'Image' (Name='CommandIcon'); target property is 'Source' (type 'ImageSource') CommandViewModel:'BitBox.Core.CommandViewModel'
System.Windows.Data Error: 44 : BindingExpression with XPath cannot bind to non-XML object.; XPath='@Name' BindingExpression:Path=/InnerText; DataItem='CommandViewModel' (HashCode=39320280); target element is 'TextBlock' (Name='CommandTitle'); target property is 'Text' (type 'String') CommandViewModel:'BitBox.Core.CommandViewModel'
System.Windows.Data Error: 44 : BindingExpression with XPath cannot bind to non-XML object.; XPath='@Description' BindingExpression:Path=/InnerText; DataItem='CommandViewModel' (HashCode=39320280); target element is 'TextBlock' (Name='CommandBody'); target property is 'Text' (type 'String') CommandViewModel:'BitBox.Core.CommandViewModel'

Ответы [ 2 ]

1 голос
/ 17 апреля 2011

Вы строите иерархию CommandViewModel на основе некоторого XML? Потому что в этом случае ваш CommandViewModel также должен иметь свойство типа XmlNode SourceNode, которое ссылается на соответствующий XmlNode, а затем в вашем XAML вы должны сделать:

       <StackPanel Orientation="Vertical"
            DataContext="{Binding ElementName=CommandTreeView, Path=SelectedItem.SourceNode}">
            <Image x:Name="CommandIcon"
                   Width="64"
                   Height="64"
                   Source="{Binding XPath=@Icon}"></Image>
        </StackPanel>

тогда должно работать.

Или, если вы вообще не используете XML, сделайте так, как предложил StellarEleven - удалите "X" и "@" из {Binding XPath=@Icon}.

1 голос
/ 17 апреля 2011

Ваш XAML использует XPath в привязке, которая используется только при привязке к документу XML:

{Binding XPath=@Icon}

Попробуйте вместо этого:

{Binding Path=Icon}

Может быть что-то еще происходиттакже.

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