2012-01-26 5 views
0

Я новичок в WPF, и я пытаюсь создать ObjectDataProvider для создания объекта, а затем использовать его в коде позади. В частности, я хотел бы обновить объект, когда текст вводится в текстовое поле. Вот XAML:Использование ObjectDataProvider для создания объекта

<Window x:Class="bindings.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local ="clr-namespace:bindings" 

    Title="Bindings" Height="410" Width="1044"> 
<Window.Resources> 
    <ObjectDataProvider x:Key ="MyStringData" ObjectType="{x:Type local:MyStrings}" /> 
</Window.Resources> 

<StackPanel> 
    <TextBox Height="23" Name="textBox1" Width="120" KeyDown="textBox1_KeyDown" /> 
    <ListBox Name="theListBox" Width="200" Height="79" 
    ItemsSource ="{Binding Source={StaticResource MyStringData}}"/> 
</StackPanel> 

Вот код позади:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void textBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Return) 
     { 

     } 

    } 
} 
public class MyStrings : List<String> 
{ 
    public MyStrings() 
    { 
     this.Add("Test1"); 
     this.Add("Test2"); 
     this.Add("Test3"); 
     this.Add("Test4"); 
    } 
} 

Мой вопрос: что я могу использовать, чтобы ссылаться на объект, созданный ObjectDataProvider, так что я могу манипулировать экземпляр MyStrings, который он создал. Благодарю.

Новый XAML:

<Window x:Class="bindings.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local ="clr-namespace:bindings" 
    Title="Bindings" Height="410" Width="1044"> 
<Window.Resources> 
    <ObjectDataProvider x:Key ="MyStringData" ObjectType="{x:Type local:MyStrings}" x:Name="myProvider" /> 
</Window.Resources> 
<StackPanel> 
    <TextBox Height="23" Name="textBox1" Width="120" KeyDown="textBox1_KeyDown" /> 
    <ListBox Name="theListBox" Width="200" Height="79" 
    ItemsSource ="{Binding Source={StaticResource MyStringData}}"/> 
</StackPanel> 

Новый код Сзади:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 
    private void textBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Return) 
     { 
      MyStrings temp = myProvider.ObjectInstance; 
     } 

    } 
} 
public class MyStrings : List<String> 
{ 
    public MyStrings() 
    { 
     this.Add("Test1"); 
     this.Add("Test2"); 
     this.Add("Test3"); 
     this.Add("Test4"); 
    } 
} 

ответ

3

Вы смотрели на ObjectInstance недвижимость?

http://msdn.microsoft.com/en-us/library/system.windows.data.objectdataprovider.objectinstance.aspx

Если вы даете ObjectDataProvider имя, как:

<ObjectDataProvider x:Key ="MyStringData" ObjectType="{x:Type local:MyStrings}" x:Name="myProvider" /> 

Тогда в вашем коде позади вы можете сделать:

myProvider.ObjectInstance 

Не забудьте проверить NULL чтобы убедиться, что он действительно создан.

+0

Я пробовал это, но VS говорит мне, что я «не могу зарегистрировать дублирующее имя« myProvider »в этой области. Почему это? – BobD

+0

@BobD Можете ли вы обновить код в своем вопросе, чтобы отразить то, что вы меняете (как XAML, так и как код позади), поэтому я могу видеть, что у вас есть. Похоже, вы назвали его в XAML, а затем также объявили его в своем коде. – CodingGorilla

+0

@ Кодирование Gorilla - см. Редактирование - Большое спасибо. – BobD

Смежные вопросы