2013-10-15 2 views
1

У меня есть usercontrol (ItemPairing), который включает в себя два comboboxes и одну кнопку. Я знаю, что я могу переопределить метод ToString(), но я хочу создать собственный метод, который возвращает массив или словарь. Элементы combobox поставляются, когда элемент управления создается, так что они передаются в качестве параметров для инициализации. В приложении будет добавлено несколько элементов управления ItemPairing (пользователь может добавлять и удалять элементы управления ItemPairing в соответствии с их потребностями), а затем итерации по всем элементам ItemPairing, когда пользователь нажимает кнопку «Выполнить».Пользовательский метод управления пользователями

Если есть более простой способ сделать это, пожалуйста, дайте мне знать. Общая идея состоит в том, чтобы позволить пользователю динамически строить парные элементы, а затем объединять каждую пару в один словарь, когда они нажимают кнопку run.

ItemPairing XAML:

<UserControl x:Class="TableComparisons.ItemPairing" 
     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" 
     x:Name="ItemPairingName" 
     mc:Ignorable="d" 
     d:DesignHeight="24" d:DesignWidth="300"> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="24"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="24"/> 
    </Grid.RowDefinitions> 
    <ComboBox Grid.Row="0" Grid.Column="0" x:Name="Table1_Fields" SelectionChanged="Table1_Fields_SelectionChanged"> 
    </ComboBox> 
    <ComboBox Grid.Row="0" Grid.Column="1" x:Name="Table2_Fields" SelectionChanged="Table2_Fields_SelectionChanged"> 
    </ComboBox> 
    <Button Grid.Row="0" Grid.Column="2" Content="X" Click="Button_Click" /> 
</Grid> 

ItempPairing C#:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace TableComparisons 
{ 
public partial class ItemPairing : UserControl 
{ 
    public string selectExpr = "None"; 
    public string fields1 = ""; 
    public string fields2 = ""; 

    public override string ToString() 
    { 
     return selectExpr; 
    } 

    private void updateSE() 
    { 
     selectExpr = this.fields1 + " = " + this.fields2; 
    } 

    public ItemPairing() 
    { 
     InitializeComponent(); 
     List<string> listFields_1 = new List<string>(); 
     listFields_1.Add("One"); 
     listFields_1.Add("Two"); 
     listFields_1.Add("Three"); 
     listFields_1.Add("Four"); 
     Table1_Fields.ItemsSource = listFields_1; 

     List<string> table2Fields = new List<string>(); 
     table2Fields.Add("A"); 
     table2Fields.Add("B"); 
     table2Fields.Add("C"); 
     table2Fields.Add("D"); 

     Table2_Fields.ItemsSource = table2Fields; 
    } 

    public ItemPairing(List<string> table1Fields, List<string> table2Fields) 
    { 
     InitializeComponent(); 
     Table1_Fields.ItemsSource = table1Fields; 
     Table2_Fields.ItemsSource = table2Fields; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     ((Panel)this.Parent).Children.Remove(this); 
    } 

    private void Table1_Fields_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     fields1 = this.Table1_Fields.SelectedValue.ToString(); 
     updateSE(); 
    } 
    private void Table2_Fields_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     fields2 = this.Table2_Fields.SelectedValue.ToString(); 
     updateSE(); 
    } 
} 
} 

Добавление ребенка ItemPairing:

UIElement pi2 = new ItemPairing(table1Fields, table2Fields); 
ParingItems.Children.Add(pi2); 

Перебор ItemPairing контролирует:

private void runPairing_Click(object sender, RoutedEventArgs e) 
{ 
    int oCount = 1; 
    foreach (object o in ParingItems.Children) 
    { 
     if (o.GetType() == typeof(ItemPairing)) 
     { 
      MessageBox.Show(o.ToString()); 
      oCount++; 
     } 
    } 
} 

ответ

0

Если вы хотите, чтобы написать эффективный WPF, то вы должны перестать пытаться использовать его, как это было в Windows Forms ... WPF все о связывании данных. Вы должны взглянуть на страницу Data Binding Overview на MSDN для углубленного ознакомления.

Чтобы ответить на ваш вопрос, общий путь для UserControl предоставить некоторые данные для того, чтобы реализовать DependencyProperty:

public static readonly DependencyProperty ResultsProperty = DependencyProperty. 
    Register("Results", typeof(Dictionary<string, string>), 
    typeof(ItemPairing), new UIPropertyMetadata(Dictionary<string, string>.Empty)); 

public Dictionary<string, string> Results 
{ 
    get { return (Dictionary<string, string>)GetValue(ResultsProperty); } 
    set { SetValue(ResultsProperty, value); } 
} 

Вы не упомянули, что тип вашей Dictionary будет, так что я просто предположил, что это будет Dictionary<string, string>.

Тогда вы можете Bind этому свойству как изнутри, так и снаружи UserControl:

<YourXmlNamespace:ItemPairing Results="{Binding YourExternalResultsProperty}" /> 

UPDATE >>>

Вы можете обрабатывать ситуацию агрегирование Results коллекции из нескольких UserControl с использованием модели основного вида, которая установлена ​​как DataContext для MainWindow. Эта модель представления может содержать либо несколько свойств, одна для привязки к каждому свойству UserControlResults или свойствам типа любых других моделей просмотра, которые вы можете использовать.

В любом случае, используя такую ​​модель основного вида, вы должны иметь класс, который содержит свойства, которые привязываются ко всем коллекциям Results, будь то в других моделях просмотра или нет, так что у вас будет доступ к ним всем , Тогда у вас может быть метод, который создает новый Dictionary из значений во всех остальных.

+0

Спасибо, Шеридан. Именно так я и шел сначала, но не мог заставить его работать так, как я хотел. Как вы можете сказать, это моя первая попытка создания UserControl. Поскольку будет несколько элементов управления ItemPairing, что было бы лучшим способом объединить результаты из всех из них в один словарь (перебирать все элементы ItemPairing и захватывать результаты или есть способ справиться с этим через привязку)? Это то место, где я был в тупик, и почему я решил, что мне нужно вернуться к общедоступному методу (я мог бы просто читать результаты вместо публичного метода). – user2884081

0

Почему бы просто не добавить публичный метод к вашему управлению и вернуть словарь?:

private Dictionary<string, string> 

private void updateSE() 
{ 
    selectExpr = this.fields1 + " = " + this.fields2; 

    if (!this.dictionary.ContainsKey(this.fields1)) 
    { 
     this.dictionary.Add(this.fields1, this.fields2); 
    } 
} 

public Dictionary<string, string> GetPairSelections() 
{ 
    return this.dictionary; 
} 
Смежные вопросы