2013-09-06 3 views
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 }); 
    } 

이이 문제와 관련하여 단지 코드입니다, 모든 코드가 아닙니다.

+0

이유에 대한 의견이 있으십니까? –

답변

0

, WPF는 null이 아닌 DataContext 속성을 가지고 ListBox에서 시작하여 시각적 트리에서 오브젝트, 찾고있다 :이 답변에서보세요. 해당 개체를 찾으면 ListBoxItemsSource 속성을 TaskList이라는 개체의 속성에 바인딩합니다. 그 바인딩에 대한 오류 메시지가 없다는 것을 언급하지 않았으므로이 바인딩이 작동한다고 가정합니다.

TaskListListBox's ItemsSource 속성에 바인딩되어 있으므로 컬렉션이라고 가정합니다.

WPF 옆 TaskList 컬렉션에있는 모든 개체를 통해 반복하고, 각각의 DataTemplate의 복사본을 생성하는 ListBoxItem 객체에 스틱, 그리고 추가하는 ListBox's Items 컬렉션에 그. DataTemplate 복사본을 작성하여 TaskList 컬렉션에있는 현재 개체의 TaskSelectedCommand 속성에 라디오 단추를 바인딩하려고합니다. 이 개체에 TaskSelectedCommand 속성을 찾을 수 없으므로 오류가 발생하고 오류 메시지가 생성됩니다.

컬렉션의 항목에 TaskSelectedCommand 속성을 만들거나 TaskList 컬렉션 속성이있는 개체에 속성을 만들 수 있습니다. 첫 번째 경우에는 XAML을 변경하지 않습니다. 두 번째 경우에는 TaskSelectedCommand의 바인딩을 변경해야하므로 RelativeSource이 지정됩니다.

관련 문제