[英]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的引用
將一個Loaded
事件添加到TextBox:
<TextBox x:Name="txtText" Width="300" Height="100" Loaded="txtText_Loaded" />
在MyPanel類中添加一個字段以保存對TextBox的引用:
public class MyPanel { public string Text { get; set; } public TextBox TextBox { get; set; } /* the rest ... */ }
在包含面板的列表旁邊的窗口中添加一個計數器:
protected ObservableCollection<MyPanel> panels = new ObservableCollection<MyPanel>(); private int counter = 0;
處理TextBox的Load事件:
private void txtText_Loaded(object sender, RoutedEventArgs e) { panels[counter].TextBox = (TextBox)sender; counter++; }
如果要訪問特定的TextBox,請按以下方式執行:
MessageBox.Show(panels[i].TextBox.Text);
III)為FontSize添加其他綁定:
將FontSize屬性添加到MyPanel類:
private double _fontSize = 10; public double FontSize { get { return _fontSize; } set { if (value != _fontSize) { _fontSize = value; NotifyPropertyChanged(); } } }
將剛添加的屬性綁定到ItemsControl中的TextBox:
<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}" />
這樣,如果更改滑塊上的值,它將更改綁定到面板的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.