【问题标题】:Accessing .Text & .Content of multiple controls within a custom control访问自定义控件中多个控件的 .Text 和 .Content
【发布时间】:2012-03-02 17:27:21
【问题描述】:

我创建了一个相当简单的UserControl,由TextBoxComboBox 组成。

<StackPanel Orientation="Horizontal">        
    <MyNamespace:MultiBox Style="{StaticResource PhoneBoxStyle}" BoxType="Phone" Grid.Column="0" Grid.Row="0" Name="phoneNumber" Margin="50,0,5,5" MinWidth="250"/>
    <ComboBox Grid.Column="1" Grid.Row="0" Height="{Binding ElementName=phoneNumber, Path=Height}" MinWidth="100" Name="callResultsSelection" ItemsSource="{Binding Source={StaticResource callResults}}" Margin="0,0,5,5"/>
</StackPanel>

然后我需要能够通过按一个按钮导出.Text.SelectedItem 值。我尝试使用如下所示的属性,但它似乎不起作用。它确实通过 IntelliSense 为控件公开了一个 .Text 属性,但它不会按预期将任何内容复制到剪贴板。

原始(和期望)方法:

public string Text
    {
        get { return phoneNumber.Text + " - " + callResultsSelection.SelectedItem + "\r\n"; }
        set { value = phoneNumber.Text + " - " + callResultsSelection.SelectedItem + "\r\n"; }
    }

后备方法:

public string Text
    {
        get { return phoneNumber.Text; }
        set { value = phoneNumber.Text; }
    }        

    public string ComboBoxSelection
    {
        get { return callResultsSelection.SelectedItem.ToString(); }
        set { value = callResultsSelection.SelectedItem.ToString(); }
    }

我使用的控制迭代如下。这些部分还有很多,但这是唯一相关的部分。

foreach (object o in ccChildren.GetChildren(tool, 3))
            {
                if (o.GetType() == typeof(CallTemplate))
                {
                    CallTemplate template = (CallTemplate)o;
                    if (template.Text != null)
                    {
                        textBuffer += template.Text;
                    }
                    else
                    {
                        textBuffer = "";
                    }
                    tempString += textBuffer;
                    textBuffer = "";
                }
            }

通过使用断点,我知道它确实到达了if 块中的决策点,但是即使VS 识别出CallTemplate 对象,它也不匹配它。有人看到问题了吗?

编辑:我知道问题不在于迭代方法 (ccChildren.GetChildren)。我将它与许多其他控件(文本框、组合框、单选按钮、复选框)一起使用,并且效果很好。该区域中唯一可能存在问题的是 CallTemplate 类型。

【问题讨论】:

  • 在属性 .Text @ set{} 中你应该使用值,而不是赋值!
  • else { textBuffer = ""; } 好像错了?!
  • 我将值切换到等号的另一边,没有效果。至于 textBuffer = "",它所遍历的控件是一系列标签和文本框。在 if 块之前,将标签添加到 textBuffer。但是如果标签所指的控件为空,则标签不需要添加到 tempString 中,因此没有空行。
  • 调试的时候这个是真还是假(template.Text != null)
  • 刚刚又查了一下,都不是。似乎问题一定出在它检查类型上,因为它从来没有设法让它进入那个 if 块。但是,如果 VS 将其识别为有效类型,那又如何呢?

标签: c# wpf user-controls properties typeof


【解决方案1】:

这是用户控件 xaml

<UserControl x:Class="WpfApplication1.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <StackPanel>
        <TextBox  Grid.Column="0" Grid.Row="0" Name="phoneNumber" Margin="50,0,5,5" MinWidth="250"/>
        <ComboBox Grid.Column="1" Grid.Row="0" Height="{Binding ElementName=phoneNumber, Path=Height}" MinWidth="100" Name="callResultsSelection" ItemsSource="{Binding stud}" DisplayMemberPath="Name" Margin="0,0,5,5"/>
    </StackPanel>

</Grid>

这是用户控件的代码隐藏

using System.Windows.Controls;
using System.Collections.ObjectModel;
namespace WpfApplication1
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
            DataContext = this;
            stud = new ObservableCollection<Student>();
            stud.Add(new Student() { Name = " chauhan", RollNo = 1212, About = "dc wecwedc wec cwec wevcwe vcwd vcwvc" });
            stud.Add(new Student() { Name = " chauhan", RollNo = 1212, About = "dc wecwedc wec cwec wevcwe vcwd vcwvc" });
            stud.Add(new Student() { Name = "chauhan", RollNo = 1212, About = "dc wecwedc wec cwec wevcwe vcwd vcwvc" });
            stud.Add(new Student() { Name = " chauhan", RollNo = 1212, About = "dc wecwedc wec cwec wevcwe vcwd vcwvc" });
            stud.Add(new Student() { Name = "chauhan", RollNo = 1212, About = "dc wecwedc wec cwec wevcwe vcwd vcwvc" });
        }
        public ObservableCollection<Student> stud
        { get; set; }
        public string Text
        {
            get
            {
                return phoneNumber.Text + " - " + callResultsSelection.SelectedItem + "\r\n";
            }
        }
    }
    public class Student
    {
        public string Name { get; set; }
        public int RollNo { get; set; }
        public string About { get; set; }
    }
}

这是使用上述用户控件的窗口 xaml

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:uc="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525">
    <Window.Resources>

    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <uc:UserControl1 Grid.Row="0" x:Name="ucw"/>
        <Button Click="Button_Click" Grid.Row="1"/>
    </Grid>
</Window>

下面是window后面的代码

using System.Windows;
namespace WpfApplication1
{
    public partial class MainWindow : Window
    {    
        public MainWindow()
        {
            InitializeComponent();

            DataContext = this;

        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(ucw.Text);
        }
    }
}

在这里,当我单击按钮时,用户控件的 Text 属性在消息框中给出了正确的值。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    所以这将是那些纯粹愚蠢的时刻之一。我唯一的问题是我没有将包含 UserControl 的 GroupBox 添加到 GroupBoxes 数组中以进行迭代。感谢您的有用回复...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      相关资源
      最近更新 更多