项目控件文本框名称在.cs文件中不起作用

本文关键字:cs 文件 不起作用 控件 文本 项目 | 更新日期: 2023-09-27 18:33:59

我的 WPF 应用程序代码在文件中定义的function call上生成面板.cs。代码中ItemControl用于生成这些Panels。我想命名此ItemControl中定义的文本框并在代码中使用它。我将其命名为 textEdit1 并在代码中使用它,但代码生成了textEdit1不存在的错误。谁能解决我的问题?这里的代码是:

XAML 文件:

<dxlc:ScrollBox>
    <ItemsControl Name="lstPanels">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="vertical">
                    <Grid>
                        <dxe:TextEdit Height="165" Text="{Binding Text,
                                    Mode=TwoWay}" x:Name="textEdit1"/>
                    </Grid>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</dxlc:ScrollBox>

.CS文件

public partial class Window1 : Window
{
    string valuu;
    public Window1()
    {
        InitializeComponent();
        addPanel("Header1");
        addPanel("Header2");
        addPanel("Header3");
        lstPanels.ItemsSource = panels;
    }
    public ObservableCollection<MyPanel> panels = new ObservableCollection<MyPanel>();
    public void addPanel(string buttonId)
    {
        MyPanel p = new MyPanel { Id = buttonId};
        panels.Add(p); 
        functionb(p);
    }
    public void functionb(MyPanel obj)
    {        
        valuu = obj.Text;            
    }
    private void button2_Click(object sender, RoutedEventArgs e)
    {
        foreach (var f in panels.ToList())
        {
            MessageBox.Show( f.Id + "   ***   "  + f.Text);
        }
    }
}
public class MyPanel : INotifyPropertyChanged
{
    private string _id;
    private string _text;
    public string Id
    {
        get { return _id; }
        set
        {
            if (value != _id)
            {
                _id = value;
                NotifyPropertyChanged();
            }
        }
    }
    public string Text
    {
        get { return _text; }
        set
        {
            if (value != _text)
            {
                _text = value;
                NotifyPropertyChanged();
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(  String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

项目控件文本框名称在.cs文件中不起作用

我看到您正在为文本框和滚动框使用一些第三方库。如果您向我提供库的名称,我可以查看它们,因为功能可能与 WPF 开箱即用的功能不同。
至于现在你有3个选项(我给出了标准文本框和项目控件的示例(:

I( 您根本不需要访问文本框。
这里描述了一个简单的解决方法:堆栈溢出帖子

II( 在代码隐藏中处理事件和对文本框的引用

  1. Loaded事件添加到文本框:

    <TextBox x:Name="txtText" Width="300" Height="100" Loaded="txtText_Loaded" />
    
  2. 向 MyPanel 类添加一个字段以保存对文本框的引用:

    public class MyPanel
    {
        public string Text { get; set; }
        public TextBox TextBox { get; set; }
        /* the rest ... */
    }
    
  3. 在窗口添加计数器,在带有面板的列表旁边:

    protected ObservableCollection<MyPanel> panels = new ObservableCollection<MyPanel>();
    private int counter = 0;
    
  4. 处理文本框的加载事件:

    private void txtText_Loaded(object sender, RoutedEventArgs e)
    {
        panels[counter].TextBox = (TextBox)sender;
        counter++;
    }
    
  5. 如果要访问特定的文本框,请按以下方式执行此操作:

    MessageBox.Show(panels[i].TextBox.Text);
    

III( 为 FontSize 添加额外的绑定:

  1. 将 FontSize 属性添加到 MyPanel 类:

    private double _fontSize = 10;
    public double FontSize
    {
        get { return _fontSize; }
        set
        {
            if (value != _fontSize)
            {
                _fontSize = value;
                NotifyPropertyChanged();
            }
        }
    }
    
  2. 将刚添加的属性绑定到项控件中的文本框:

    <TextBox x:Name="txtText" Width="300" Height="100" Text="{Binding Text;, Mode=TwoWay}"
             FontSize="{Binding FontSize, Mode=OneWay}" />
    
  3. 将滑块添加到模板并将其绑定到同一属性:

    <Slider Minimum="10" Maximum="30" Value="{Binding FontSize, Mode=TwoWay}" />
    

这样,如果您更改滑块上的值,它将更改绑定到面板的 MyPanel 对象中的值。这反过来将更改文本框的字体大小。

我测试过的整个代码看起来像这样:

<ItemsControl x:Name="lstItems" >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <TextBox x:Name="txtText" Width="300" Height="100" Text="{Binding Text;, Mode=TwoWay}" FontSize="{Binding FontSize, Mode=OneWay}" />
                    <Slider Minimum="10" Maximum="30" Value="{Binding FontSize, Mode=TwoWay}" />
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

和代码隐藏:

public partial class MainWindow : Window
{
    protected ObservableCollection<MyPanel> texts = new ObservableCollection<MyPanel>();
    public MainWindow()
    {
        InitializeComponent();
        texts.Add(new MyPanel() { Text = "Test 1" });
        texts.Add(new MyPanel() { Text = "Test 2" });
        lstItems.ItemsSource = texts;
    }
}
public class MyPanel : INotifyPropertyChanged
{
    private string _id;
    private string _text;
    private double _fontSize = 10;
    public string Id
    {
        get { return _id; }
        set
        {
            if (value != _id)
            {
                _id = value;
                NotifyPropertyChanged();
            }
        }
    }
    public string Text
    {
        get { return _text; }
        set
        {
            if (value != _text)
            {
                _text = value;
                NotifyPropertyChanged();
            }
        }
    }
    public double FontSize
    {
        get { return _fontSize; }
        set
        {
            if (value != _fontSize)
            {
                _fontSize = value;
                NotifyPropertyChanged();
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

我个人会选择最后一个解决方案。
但是,再次让我知道您正在使用哪些库,当我有时间时,我会查看它们。祝你好运。

textEdit1是模板的一部分,该模板将被多次实例化,因此将有多个textEdit1实例。为类中的textEdit1生成字段是没有意义的,因为它只能引用TextEdit控件的一个实例......