【问题标题】:How to access Telerik's RadDataGrid cell content from code behind for UWP?如何从 UWP 的代码中访问 Telerik 的 RadDataGrid 单元格内容?
【发布时间】:2018-05-20 07:54:44
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: xaml binding uwp telerik grid


    【解决方案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));
            }
        }
    }
    

    【讨论】:

    • 恐怕您的解决方案不适用于我的情况。这是我在运行您的代码 sn-p 后得到的屏幕截图:link 尽管第一行和最后一行的文本框包含文本(前几秒钟),但文本框是可编辑的。我想要的是使这两个 textbosex 只读。其他文本框将重新可编辑。 p.s.我正在使用来自 json 的动态绑定。我没有用于绑定的任何特定模型。所以我认为如果我能以任何方式访问控件是最好的。 p.s.1:感谢代码 sn-p :)
    • @user1814131 我只是给你一个简单的代码示例来告诉你如何通过绑定来动态设置IsReadOnly。如果你想让这两个文本框在它们包含文本时只读。您只需要更改Country 属性中if/else 块中的代码逻辑即可。
    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    相关资源
    最近更新 更多