0

因此,我在单选按钮上有一个命令,该命令绑定到 itemsource 之外的方法(即 ObservableCollection)。单击单选按钮时会产生错误。

错误:

System.Windows.Data Error: 40 : BindingExpression path error: 'TaskSelectedCommand' property not found on 'object' ''Task' (HashCode=46555789)'. BindingExpression:Path=TaskSelectedCommand; DataItem='Task' (HashCode=46555789); target element is 'RadioButton' (Name=''); target property is 'Command' (type 'ICommand')

数据模板 XAML 代码:

<Window.Resources>
        <DataTemplate x:Key="Tasks">
                <StackPanel>
                    <Grid>
                    <RadioButton ToolTip="Start tracker" GroupName="rdoExchange" Grid.Row="1" Grid.Column="1" Margin="2,0,10,1" Command="{Binding TaskSelectedCommand}" IsChecked="{Binding Selected}" Height="22" VerticalAlignment="Bottom"/>
                    <TextBox ToolTip="Task currently being tracked" IsEnabled="true" Margin="25,15,-375,4" Grid.Row="0" Grid.Column="0"  Text="{Binding Name}" RenderTransformOrigin="6.033,0.727" />
                    <TextBox Grid.Row="0" Margin="430,15,-455,4" Grid.Column="0"  Text="{Binding Time}"/>
                    </Grid>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>

使用列表框上的数据模板:

    <StackPanel Name="allTaskList" Orientation="Vertical" Margin="0,10,0,0">
        <ListBox IsSynchronizedWithCurrentItem="True"  Height="171" HorizontalAlignment="Left" ItemsSource="{Binding TaskList}" 
            HorizontalContentAlignment="Stretch" Margin="25,10,-523,0" VerticalAlignment="Top" Width="512" ItemTemplate="{StaticResource Tasks}"/>
    </StackPanel>

Task.cs 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace Sundial
{
    public class Task
    {
        public int id { get; set; }

        public string Name { get; set; }

        public double Time { get; set; }

        public bool Selected { get; set; }


    }
}

MainWindowViewModel.cs 代码:

public ICommand TaskSelectedCommand
        {
            get
            {
                return mTaskSelected;
            }
            set
            {
                mTaskSelected = value;
            }

        }
public MainWindowViewModel()
        {

            TaskSelectedCommand = new RelayCommand(new Action<object>(TaskSelected));
            TaskList = new ObservableCollection<Task>();
    }



public void TaskSelected(object obj)
        {

            var task = TaskList.FirstOrDefault(i => i.Selected == true);

            if (task != null)
            {
                timer.Start();
            }


        }
public void AddTask(object obj)
        {
            TaskList.Add(new Task() { id = taskNum, Name = "Task", Selected = false, Time = 0.0 });
    }

这不是所有的代码,这只是与问题相关的代码。

4

2 回答 2

0

在这种情况下,您在命令绑定的声明中使用 RelativeSource。看看这个答案: 如何将 WPF 绑定与 RelativeSource 一起使用?

于 2013-09-06T18:04:45.433 回答
0

在编写 XAML 时,WPF 正在可视化树中查找从 开始的ListBox具有非空DataContext属性的对象。当它找到该对象时,它会将ListBox' 的ItemsSource属性绑定到该对象的一个​​名为 的属性TaskList。我假设此绑定正在工作,因为您没有提到有关该绑定失败的任何错误消息。

由于TaskList绑定到该ListBox's ItemsSource属性,我假设它是一个集合。

WPF 接下来循环遍历TaskList集合中的所有对象,并为每个对象创建一个副本,将其DataTemplate粘贴到一个ListBoxItem对象中,然后将其添加到ListBox's Items集合中。它在构建 的副本DataTemplate时尝试将单选按钮绑定到集合TaskSelectedCommand中当前对象的属性。它没有在该对象上TaskList找到属性,因此它失败并生成错误消息。TaskSelectedCommand

您可以在集合中的项目上创建一个属性,也可以在具有该集合属性TaskSelectedCommand的对象上创建一个。TaskList在第一种情况下,您不对 XAML 进行任何更改。在第二种情况下,您必须更改绑定,TaskSelectedCommand以便它指定一个RelativeSource.

于 2013-09-06T18:22:17.967 回答