C# WPF数据绑定错误--System.Windows.Data错误:40

C# WPF数据绑定错误--System.Windows.Data错误:40,c#,wpf,xaml,C#,Wpf,Xaml,我一直在努力弄清楚为什么我总是遇到这个WPF XAML数据绑定错误 System.Windows.Data错误:40:BindingExpression路径错误:在“对象”“树视图项”(名称=“”)上找不到“源”属性。无效的 System.Windows.Data错误:40:BindingExpression路径错误:在“对象”“树视图项”(名称=“”)上找不到“源”属性。空的 我在XAML代码中找到了这一行 <local:GameLogSourceTree x:Name="_gam

我一直在努力弄清楚为什么我总是遇到这个WPF XAML数据绑定错误

System.Windows.Data错误:40:BindingExpression路径错误:在“对象”“树视图项”(名称=“”)上找不到“源”属性。无效的 System.Windows.Data错误:40:BindingExpression路径错误:在“对象”“树视图项”(名称=“”)上找不到“源”属性。空的

我在XAML代码中找到了这一行

   <local:GameLogSourceTree x:Name="_gamesSourcesTree" TreeNodeStyle="{StaticResource GenericFolders}" TreeStyle="{StaticResource GenericTreeStyle}" NodeSortDescriptions="{StaticResource AscendingNames}"/> 

这是指xaml代码DataTriggers中的“Source”属性,如果正确的话。非常感谢您的帮助

下面是XAML代码&它背后的C代码

 XAML Code 

    <UserControl x:Class="Test.UI.Noc"
         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"
         mc:Ignorable="d" 
         xmlns:local="clr-namespace:Test.UI"
         xmlns:cm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
         xmlns:Logs="clr-namespace:Test.Logs;assembly=Test.Logs">
 <UserControl.Resources>
    <local:SourceStateConverter x:Key="gamesourceStateConverter"/>
    <DataTemplate x:Key="GameNodeTemplate" DataType="{x:Type local:GameLogSourceNode}">
        <StackPanel x:Name="GroupPanel" Orientation="Horizontal" Margin="0,2,0,2">
            <Image x:Name="Folder"   Source="/Test.UI;component/Test.UI/Images/GameRoot.png"/>
            <TextBlock x:Name="CategoryName" Margin="2,0,0,0" Text="{Binding Path=Source.(Logs:IGameLogsSource.Name)}"/>
        </StackPanel>
        <DataTemplate.Triggers>
            <DataTrigger Value="True" Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource TemplatedParent}}">
                <Setter TargetName="CategoryName" Property="TextBlock.FontWeight" Value="Bold"/>
                <Setter Property="UIElement.Effect">
                    <Setter.Value>
                        <DropShadowEffect ShadowDepth="2" BlurRadius="10" RenderingBias="Quality"/>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
            <DataTrigger Value="-1" Binding="{Binding Path=Source, Converter={StaticResource gamesourceStateConverter}}">
                <Setter TargetName="Folder" Property="Image.Source" Value="/Test.UI;component/Test.UI/Images/Process.png"/>
            </DataTrigger>
            <DataTrigger Value="0" Binding="{Binding Path=Source, Converter={StaticResource gamesourceStateConverter}}">
                <Setter TargetName="Folder" Property="Image.Source" Value="/Test.UI;component/Test.UI/Images/Process.png"/>
            </DataTrigger>
            <DataTrigger Value="1" Binding="{Binding Path=Source, Converter={StaticResource gamesourceStateConverter}}">
                <Setter TargetName="Folder" Property="Image.Source"
              Value="/Test.UI;component/Test.UI/Images/GameStopping.png"/>
            </DataTrigger>
            <DataTrigger Value="2" Binding="{Binding Path=Source, Converter={StaticResource gamesourceStateConverter}}">
                <Setter TargetName="Folder" Property="Image.Source"
              Value="/Test.UI;component/Test.UI/Images/GameStopped.png"/>
            </DataTrigger>
            <DataTrigger Value="Games" Binding="{Binding Path=Source.(Logs:IGameLogsSource.Name)}">
                <Setter TargetName="Folder" Property="Image.Source"
              Value="/Test.UI;component/Test.UI/Images/GameRoot.png"/>
            </DataTrigger>
            <DataTrigger Value="Common" Binding="{Binding Path=Source.(Logs:IGameLogsSource.Name)}">
                <Setter TargetName="Folder" Property="Image.Source"
              Value="/Test.UI;component/Test.UI/Images/NocRoot.png"/>
            </DataTrigger> 
        </DataTemplate.Triggers>
    </DataTemplate>
    <Style x:Key="GenericFolders" TargetType="{x:Type TreeViewItem}">
        <Style.Resources>
            <Brush x:Key="{x:Static SystemColors.HighlightBrushKey}">Transparent</Brush>
            <Brush x:Key="{x:Static SystemColors.ControlBrushKey}">Transparent</Brush>
            <Brush x:Key="{x:Static SystemColors.ControlTextColorKey}">Black</Brush>
        </Style.Resources>
        <Setter Property="HeaderTemplate" Value="{StaticResource GameNodeTemplate}"/>
    </Style>
    <Style x:Key="GenericTreeStyle" TargetType="{x:Type TreeView}">
        <Setter Property="Background">
            <Setter.Value>
                <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                    <GradientStop Color="#FFF" Offset="0.0"/>
                    <GradientStop Color="#AAA" Offset="1.0"/>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
        <Setter Property="BorderThickness" Value="4"/>
        <Setter Property="BorderBrush" Value="#FFA6AAAB"/>
    </Style>
    <cm:SortDescriptionCollection x:Key="AscendingNames">
        <cm:SortDescription PropertyName="Source.(Logs:IGameLogsSource.Name)" Direction="Ascending"/>
    </cm:SortDescriptionCollection>
    <Style TargetType="{x:Type TextBlock}">
        <Setter Property="TextWrapping" Value="Wrap"/>
    </Style>
</UserControl.Resources>
<Grid x:Name="RootGrid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="auto" MinWidth="175"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <local:GameLogSourceTree x:Name="_gamesSourcesTree" TreeNodeStyle="{StaticResource GenericFolders}" TreeStyle="{StaticResource GenericTreeStyle}" NodeSortDescriptions="{StaticResource AscendingNames}"/>
    <GridSplitter Grid.Column="0" HorizontalAlignment="Right" Width="2"/>
    <local:LogControl x:Name="_gamesLogControl" Grid.Column="1"/>
</Grid>
XAML代码
透明的
透明的
黑色

下面是它后面的C

// C# code 

 namespace Test.UI
 {
public partial class Noc : ILogListener
{
    private readonly Dictionary<Guid, Tuple<LogMessageCollection, GameLogSourceNode>> _logInfo = new Dictionary<Guid, Tuple<LogMessageCollection, GameLogSourceNode>>();


    public LogControl LogControl
    {
        get
        {
            return _gamesLogControl;
        }
    }


    public Noc()
    {
        InitializeComponent();
        _logInfo.Add(_gamesSourcesTree.GameRootNode.Source.Id, new Tuple<LogMessageCollection, GameLogSourceNode>(new LogMessageCollection(), _gamesSourcesTree.GameRootNode));
        _logInfo.Add(_gamesSourcesTree.CoreRootNode.Source.Id, new Tuple<LogMessageCollection, GameLogSourceNode>(new LogMessageCollection(), _gamesSourcesTree.CoreRootNode));
        _gamesSourcesTree.SelectedItem = _gamesSourcesTree.GameRootNode;
        _gamesSourcesTree.NodeAdded += OnSourcesTreeNodeAdded;
        _gamesSourcesTree.NodeRemoved += OnSourcesTreeNodeRemoved;
    }



    private void AddNodeIfNeeded(IGameLogsSource source)
    {
        IGameLogsSource i;
        GameLogSourceNode item2;
        if (_logInfo.ContainsKey(source.Id))
        {
            return;
        }
        var logSources = new Stack<IGameLogsSource>();
        logSources.Push(source);
        for (i = source.Parent; i != null && !_logInfo.ContainsKey(i.Id); i = i.Parent)
        {
            logSources.Push(i);
        }
        if (i != null)
        {
            item2 = _logInfo[i.Id].Item2;
        }
        else
        {
            i = logSources.Peek();
            item2 = (i is Game ? _gamesSourcesTree.GameRootNode : _gamesSourcesTree.CoreRootNode);
        }
        foreach (var logSource in logSources)
        {
            var tuple = _logInfo.TryGetValue(logSource.Id);
            if (tuple != null)
            {
                item2 = tuple.Item2;
            }
            else
            {
                var logSourceNode = new GameLogSourceNode(logSource, _gamesSourcesTree);
                item2.ChildNodes.Add(logSourceNode);
                item2 = logSourceNode;
            }
        }
    }



    public void Load(SettingsStorage storage)
    {
        storage.SetValue("LogControl", _gamesLogControl.Save());
    }

    private void OnSelectedItemChanged(object sender, RoutedTreeItemEventArgs<GameLogSourceNode> e)
    {
        _gamesLogControl.Messages = (e.NewItem != null ? _logInfo[e.NewItem.Source.Id].Item1 : new LogMessageCollection());
    }

    private void OnSourcesTreeNodeAdded(GameLogSourceNode node)
    {
        _logInfo.Add(node.Source.Id, new Tuple<LogMessageCollection, GameLogSourceNode>(new LogMessageCollection(), node));
    }

    private void OnSourcesTreeNodeRemoved(GameLogSourceNode node)
    {
        foreach (var childNode in node.ChildNodes)
        {
            OnSourcesTreeNodeRemoved(childNode);
        }
        _logInfo.Remove(node.Source.Id);
    }

    public void Save(SettingsStorage storage)
    {
        var value = storage.GetValue<SettingsStorage>("LogControl");
        if (value != null)
        {
            ((IPersistable)_gamesLogControl).Load(value);
        }
    }



    public virtual void WriteMessage(LogMessage message)
    {
        if (message == null)
        {
            throw new ArgumentNullException("message");
        }
        WriteMessages(message.Source, new[] { message });
    }

    public virtual void WriteMessages(IEnumerable<LogMessage> messages)
    {
        if (messages == null)
        {
            throw new ArgumentNullException("messages");
        }
        (
            from m in messages
            group m by m.Source).ForEach<IGrouping<IGameLogsSource, LogMessage>>(g => WriteMessages(g.Key, g));
    }

    private void WriteMessages(IGameLogsSource source, IEnumerable<LogMessage> messages)
    {
        AddNodeIfNeeded(source);
        for (var i = _logInfo[source.Id].Item2; i != null; i = i.ParentNode)
        {
            var item1 = _logInfo[i.Source.Id].Item1;
            item1.AddRange(messages);
            if (item1.Count > 2 * _gamesLogControl.MaxItemsCount && _gamesLogControl.MaxItemsCount > 0)
            {
                item1.RemoveRange(0, item1.Count - _gamesLogControl.MaxItemsCount);
            }
        }
    }
}
  }
/C#代码
命名空间Test.UI
{
公共部分类Noc:iGlistener
{
专用只读词典_logInfo=新词典();
公共日志控制日志控制
{
得到
{
返回游戏控制;
}
}
公共国家奥委会()
{
初始化组件();
_添加(_gamesSourcesTree.gamesrootnode.Source.Id,新元组(new LogMessageCollection(),_gamesSourcesTree.gamesrootnode));
_添加(_gamesSourcesTree.CoreRootNode.Source.Id,新元组(new LogMessageCollection(),_gamesSourcesTree.CoreRootNode));
_GamesSourceTree.SelectedItem=\u GamesSourceTree.GameRootNode;
_GamesSourceTree.nodeaded+=资源树上的nodeaded;
_GamesSourceTree.NodeRemoved+=OnSourceTreeNodeRemoved;
}
私有void addNodeIfNeed(IGameLogsSource源)
{
IGameLogsSource i;
GameLogSourceNode项2;
if(_logInfo.ContainsKey(source.Id))
{
返回;
}
var logSources=新堆栈();
logSources.Push(源);
for(i=source.Parent;i!=null&&!\u logInfo.ContainsKey(i.Id);i=i.Parent)
{
logSources.Push(i);
}
如果(i!=null)
{
item2=\u logInfo[i.Id].item2;
}
其他的
{
i=logSources.Peek();
item2=(i是游戏?\u GamesSourceTree.GameRootNode:\u GamesSourceTree.CoreRootNode);
}
foreach(logSources中的var logSource)
{
var tuple=\u logInfo.TryGetValue(logSource.Id);
if(元组!=null)
{
item2=tuple.item2;
}
其他的
{
var logSourceNode=新游戏logSourceNode(logSource,_gamesSourcesTree);
item2.ChildNodes.Add(logSourceNode);
item2=logSourceNode;
}
}
}
公共空荷载(设置存储)
{
storage.SetValue(“LogControl”,_gamesLogControl.Save());
}
SelectedItemChanged上的私有无效(对象发送方,RoutedTreeItemEventArgs e)
{
_gamesLogControl.Messages=(e.NewItem!=null?\u logInfo[e.NewItem.Source.Id].Item1:new LogMessageCollection();
}
资源树上的私有无效已失效(GameLogSourceNode节点)
{
_添加(node.Source.Id,新元组(new LogMessageCollection(),node));
}
资源树上的私有无效已删除(GameLogSourceNode节点)
{
foreach(node.ChildNodes中的var childNode)
{
OnSourceTreeNodeMoved(子节点);
}
_移除(node.Source.Id);
}
公共作废保存(设置存储)
{
var值=storage.GetValue(“LogControl”);
if(值!=null)
{
((IPersistable)u gamesLogControl).加载(值);
}
}
公共虚拟无效写消息(日志消息)
{
如果(消息==null)
{
抛出新的ArgumentNullException(“消息”);
}
WriteMessages(message.Source,new[]{message});
}
公共虚拟空写消息(IEnumerable消息)
{
如果(消息==null)
{
抛出新的ArgumentNullException(“消息”);
}
(
从消息中的m
按m.Source.ForEach(g=>WriteMessages(g.Key,g))将m分组;
}
私有void WriteMessages(IGameLogsSource源,IEnumerable消息)
{
AddNodeIfNeeded(源);
对于(var i=\u logInfo[source.Id].Item2;i!=null;i=i.ParentNode)
{
var item1=\u logInfo[i.Source.Id].item1;
项目1.添加范围(消息);
如果(item1.Count>2*_gamesLogControl.maxitemscont&&u gamesLogControl.maxitemscont>0)
{
item1.RemoveRange(0,item1.Count-\u gamesLogControl.MaxItemsCount);
}
}
}
}
}

在哪里将实际数据绑定到树?您需要设置树的ItemSource属性。由于您使用的是codebehind,我猜想应该是这样的:

_gamesSourcesTree.ItemsSource = _logInfo;

错误很明显:
TreeViewItem
类不包含名为
Source
的成员。你真的应该创建一个合适的ViewModel并删除所有的代码。不确定你所指的ItemsSource是什么,但需要细化great@user2712741ItemsSour