ItemsControl TextBox名称不在.cs文件中工作

时间:2013-10-04 12:04:15

标签: c# .net wpf

我的WPF应用程序代码在.cs文件中定义的function call上生成面板。代码中使用了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));
        }
    }
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

I)您根本不必访问文本框。
这里有一个简单的方法:StackOverflow post

II)在

背后的代码中处理事件和对TextBoxes的引用
  1. 在TextBox中添加Loaded事件:

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

    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. 处理TextBox的Load事件:

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

    MessageBox.Show(panels[i].TextBox.Text);
    
  6. III)为FontSize添加其他绑定:

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

      private double _fontSize = 10;
      public double FontSize
      {
          get { return _fontSize; }
          set
          {
              if (value != _fontSize)
              {
                  _fontSize = value;
                  NotifyPropertyChanged();
              }
          }
      }
      
    2. 将添加的属性绑定到ItemsControl中的TextBox:

      <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}" />
      
    4. 这样,如果更改滑块上的值,它将更改绑定到面板的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));
              }
          }
      }
      

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