2017-10-16 7 views
0

UWP 응용 프로그램을 개발 중이며 Telerik의 RadDataGrid 컨트롤에 데이터를 표시해야합니다. 한 시나리오에서는 TemplatedColumn을 사용하여 데이터를 표시하고 DataTemplate 내부에 배치 된 컨트롤에 명령을 바인딩해야하지만 명령은 ViewModel에서 트리거되지 않지만 이러한 이벤트에 이벤트를 첨부하면 이벤트가 코드에서 트리거됩니다.RadDataGrid의 TemplatedColumn에서 바인딩 명령 UWP

여기
<Interactivity:Interaction.Behaviors> 
    <Core:EventTriggerBehavior EventName="Loaded"> 
     <Core:CallMethodAction MethodName="LoadData" 
           TargetObject="{Binding}" /> 
    </Core:EventTriggerBehavior> 
</Interactivity:Interaction.Behaviors> 

<Grid x:Name="gdRoot"> 

    <telerikGrid:RadDataGrid ItemsSource="{x:Bind AvailableVM.PickListItems,Mode=OneWay}" 
          Background="{StaticResource GridLinesBrush}" 
          SelectionUnit="Cell" 
          GridLinesBrush="{StaticResource GridLinesBrush}" 
          AlternateRowBackground="{StaticResource AlternateRowBackground}" 
          AutoGenerateColumns="False" 
          ScrollViewer.VerticalScrollBarVisibility="Hidden"> 
     <telerikGrid:RadDataGrid.Columns> 
      <telerikGrid:DataGridTemplateColumn Header="Assign" 
               SizeMode="Auto"> 
       <telerikGrid:DataGridTemplateColumn.CellContentTemplate> 
        <DataTemplate> 
          <Button Background="Transparent" 
            Command="{Binding DataContext.ListSelectedCommand, ElementName=gdRoot}"/> 
        </DataTemplate> 
       </telerikGrid:DataGridTemplateColumn.CellContentTemplate> 
      </telerikGrid:DataGridTemplateColumn> 
     </telerikGrid:RadDataGrid.Columns> 
    </telerikGrid:RadDataGrid> 
</Grid> 

는 뷰 모델 코드입니다 :이 뒤에 가능한 이유가 될 수 무엇

private ICommand _listSelectedCommand; 

    public ICommand ListSelectedCommand 
    { 
     get { return _listSelectedCommand; } 
     set { Set(nameof(ListSelectedCommand), ref _listSelectedCommand,value); } 
    } 

public void LoadData() 
    { 
     InitializeCommands(); 
    } 
private void InitializeCommands() 
    { 
     ListSelectedCommand= new RelayCommand(()=> 
     { 

     }); 
    } 

여기

는 코드입니다.

답변

0

명령에 대한 가능한 가장 좋은 이유는 명령을 올바르게 바인드하지 않아야한다는 것입니다. 코드 스 니펫이 가득 차서는 안되기 때문에 잘못된 바인딩은 여러 가지 이유로 발생할 수 있습니다. 여기에 제가 테스트 한 작은 데모가 있습니다. 당신이 참조 할 수있는 편이 좋을 것 같습니다.

XAML : 뒤에

<telerikGrid:RadDataGrid ItemsSource="{x:Bind AvailableVM.PickListItems,Mode=OneWay}" 
       Background="White" 
       SelectionUnit="Cell" 
       GridLinesBrush="Pink" 
       AlternateRowBackground="Azure" 
       AutoGenerateColumns="False" 
       ScrollViewer.VerticalScrollBarVisibility="Hidden" 
       x:Name="radgrid"> 
    <telerikGrid:RadDataGrid.Columns> 
     <telerikGrid:DataGridTextColumn PropertyName="Country"/> 
     <telerikGrid:DataGridTextColumn PropertyName="City"/> 
     <telerikGrid:DataGridTemplateColumn Header="Assign" SizeMode="Auto"> 
      <telerikGrid:DataGridTemplateColumn.CellContentTemplate> 
       <DataTemplate x:DataType="local:DataTest"> 
        <Button Background="Transparent" Command="{x:Bind ListSelectedCommand }" Content="command testing" /> 
       </DataTemplate> 
      </telerikGrid:DataGridTemplateColumn.CellContentTemplate> 
     </telerikGrid:DataGridTemplateColumn> 
    </telerikGrid:RadDataGrid.Columns> 
</telerikGrid:RadDataGrid> 

코드 :

public ViewModel AvailableVM { get; set; } 
public MainPage() 
{ 
    this.InitializeComponent(); 
    AvailableVM = new ViewModel(); 
} 

public class ViewModel 
{ 
    public void Testmethod() 
    { 

    }   
    public ObservableCollection<DataTest> PickListItems { get; set; } 
    public ViewModel() 
    { 
     PickListItems = new ObservableCollection<DataTest>() 
     { 
      new DataTest { Country = "Brazil", City = "Caxias do Sul", ListSelectedCommand = new RelayCommand(()=>{ })}, 
      new DataTest { Country = "Ghana", City = "Wa", ListSelectedCommand = new RelayCommand(Testmethod)}, 
      new DataTest { Country = "Brazil", City = "Fortaleza"} 
     }; 
    } 
} 

public class DataTest 
{ 
    public string City { get; set; } 
    public string Country { get; set; } 
    public ICommand ListSelectedCommand { get; set; } 
} 
class RelayCommand : ICommand 
{ 
    public event EventHandler CanExecuteChanged; 

    private Action _action; 

    public RelayCommand(Action action) 
    { 
     this._action = action; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 

    public void Execute(object parameter) 
    { 
     this._action(); 
    } 
} 

그런데는 CellContentTemplate 바인딩에 영향이있을 수 있습니다. 위의 방법으로 묶으려고했다. 또한 RadDataGrid에는 고유 한 commands가 있습니다. 시나리오가 하나만있는 경우 참조 할 수 있습니다.

+0

감사합니다. @Sunteen. 나는 그 이유를 발견했다. 다음 링크는 https://www.telerik.com/forums/what-is-the-correct-way-to-bind-a-command-on-button-in-template입니다. –