Доступ к .Text & .Content нескольких элементов управления в пользовательском элементе управления - PullRequest
1 голос
/ 02 марта 2012

Я создал довольно простой UserControl, состоящий из TextBox и ComboBox.

<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 из них нажатием одной кнопки.Я попытался использовать свойство, как показано ниже, но, похоже, оно не работает.Он предоставляет свойство .Text через IntelliSense для элемента управления, но ничего не копирует в буфер обмена, как предполагалось.

Оригинальный (и желательный) подход:

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.

Ответы [ 2 ]

0 голосов
/ 03 марта 2012

Так что это будет один из тех моментов полной глупости. Моя единственная проблема заключалась в том, что я не добавил GroupBox, содержащий UserControl, в массив GroupBoxes для итерации. Спасибо за полезные ответы, хотя ...

0 голосов
/ 02 марта 2012

это пользовательский контроль 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, где используется вышеуказанный usercontrol

<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>

А ниже код позади окна

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 пользовательского контроля дает правильное значение в окне сообщения. Надеюсь, это поможет.

...