1

我的 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));
        }
    }
}
4

2 回答 2

2

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

于 2013-10-04T12:08:16.250 回答
2

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

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

II) 在后面的代码中处理事件和对 TextBoxes 的引用

  1. 向您的文本框添加一个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);
    

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}" />
    

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

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

于 2013-10-04T14:25:02.813 回答