簡體   English   中英

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

[英]ItemsControl TextBox Name is not Working in .cs File

我的WPF應用程序代碼在.cs文件中定義的function call上生成面板。 代碼中使用ItemControl來生成這些Panels 我想在這個ItemControl定義Name Textbox並在代碼中使用它。 我將其命名為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));
        }
    }
}

textEdit1是將多次實例化的模板的一部分,因此將有多個textEdit1實例。 在類中為textEdit1生成一個字段是沒有意義的,因為它只能引用TextEdit控件的一個實例...

我看到你正在為TextBox和ScrollBox使用一些第三方庫。 如果您向我提供庫的名稱,我可以查看它們,因為功能可能與WPF開箱即用的功能不同。
至於現在你有3個選項(我給出標准TextBox和ItemsControl的例子):

I)您根本不必訪問文本框。
這里描述了一個簡單的方法: StackOverflow帖子

II)在后面的代碼中處理事件和對TextBox的引用

  1. 將一個Loaded事件添加到TextBox:

     <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));
        }
    }
}

我個人會選擇最后的解決方案。
但是,再次告訴我你正在使用的庫,當我有一些時間時,我會看看它們。 祝好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM