如何从UWP的代码中访问Telerik的RadDataGrid单元格内容?

时间:2017-12-06 12:22:11

标签: xaml binding uwp telerik grid

我们已经使用DataGridTemplateColumn为我们的网格显示每列下的texbox。如果文本框包含任何数据(对于数据加载情况),我们需要使文本框只读。为了实现这一点,我们需要访问radgrid下的所有文本框控件。到目前为止,我们已尝试过以下方法

  • 使用VisualTreeHelper查找所有子控件 - 未找到文本框控件
  • 尝试使用DataBindingComplete事件

有没有办法从RadDataGrid的代码隐藏中访问底层单元格的控件?

替代方法:我们可以以某种方式使用一些绑定来使用IsReadOnly属性来检查它的值并在值存在时使控件只读吗?

1 个答案:

答案 0 :(得分:1)

  

我们可以以某种方式使用一些绑定来使用IsReadOnly属性来检查它的值并在值存在时使控件只读吗?

是。你当然可以通过使用Binding来实现这一点。您只需要定义bool属性并将TextBox的IsReadOnly属性绑定到此属性。然后,您可以根据TextBox的文本更改此bool值。

请参阅我的以下代码示例以供参考:

<telerikGrid:RadDataGrid x:Name="grid" AutoGenerateColumns="False" VerticalAlignment="Center">
        <telerikGrid:RadDataGrid.Columns>
            <telerikGrid:DataGridTemplateColumn Header="Country">
                <telerikGrid:DataGridTemplateColumn.CellContentTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding Country}" HorizontalAlignment="Center" VerticalAlignment="Center" IsReadOnly="{Binding IsReadOnly}"/>
                    </DataTemplate>
                </telerikGrid:DataGridTemplateColumn.CellContentTemplate>
            </telerikGrid:DataGridTemplateColumn>

            <telerikGrid:DataGridTemplateColumn Header="Flag">
                <telerikGrid:DataGridTemplateColumn.CellContentTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Flag}" />
                        </StackPanel>
                    </DataTemplate>
                </telerikGrid:DataGridTemplateColumn.CellContentTemplate>
            </telerikGrid:DataGridTemplateColumn>
        </telerikGrid:RadDataGrid.Columns>
</telerikGrid:RadDataGrid>
public sealed partial class MainPage : Page
{
    ObservableCollection<Data> list = new ObservableCollection<Data>();
    public MainPage()
    {
        this.InitializeComponent();

        list.Add(new Data { Country = "Argentina",Flag="A"});
        list.Add(new Data {Country=string.Empty,Flag="B"});
        list.Add(new Data { Country = "China",Flag="C"});
        this.grid.ItemsSource = list;
        this.Loaded += MainPage_Loaded;
    }

    private async void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        await Task.Delay(5000);
        list[1].Country = "Brazil";
    }
}

public class Data:INotifyPropertyChanged
{
    private string _Country;
    public string Country
    {
        get { return _Country; }
        set
        {
            _Country = value;
            if (string.IsNullOrEmpty(value))
            {
                IsReadOnly = true;
            }
            else
            {
                IsReadOnly = false;
            }
            RaisePropertyChanged("Country");
        }
    }

    private string _Flag;
    public string Flag
    {
        get { return _Flag;}
        set
        {
            _Flag = value;
            RaisePropertyChanged("Flag");
        }
    }

    private bool _IsReadOnly=false;
    public bool IsReadOnly
    {
        get { return _IsReadOnly; }
        set
        {
            _IsReadOnly = value;
            RaisePropertyChanged("IsReadOnly");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string PropertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this,new PropertyChangedEventArgs(PropertyName));
        }
    }
}