2014-11-18 3 views
1

Связывание с моей ItemsControl ItemsTemplate не работает. Я прошел через некоторые другие подобные проблемы переполнения стека, но я не могу понять проблему с моей привязкой. Может кто-нибудь, пожалуйста, покажите мне, что я делаю неправильно с моей привязкой?Связывание с TextBox внутри элемента ItemsControl ItemTemplate

Выдержка из ViewModel MainWindow;

private ObservableCollection<uint> words; 
private uint word; 
private int numberOfWords; 

public ObservableCollection<uint> Words 
{ 
    get 
    { 
     return this.words; 
    } 

    set 
    { 
     this.words = value; 

     this.NotifyPropertyChanged(m => m.Words); 
    } 
} 

public uint Word 
{ 
    get 
    { 
     return this.word; 
    } 

    set 
    { 
     this.word = value; 

     this.NotifyPropertyChanged(m => m.Word); 
    } 
} 

public int NumberOfWords 
{ 
    get 
    { 
     return this.numberOfWords; 
    } 

    set 
    { 
     this.numberOfWords = value; 

     this.NotifyPropertyChanged(m => m.NumberOfWords); 

     this.Words.Clear(); 

     for (uint x = 0; x < value; x++) 
     { 
      this.Words.Add(this.Word); 
     } 
    } 
} 

У меня есть элемент ItemsControl внутри пользовательского элемента управления. MainWindow имеет свой DataContext, установленный в ViewModel, который использует ItemsControl. Связывание с ItemsSource работает, и я получаю много текстовых полей, которые я указываю, но при установке значения в TextBox привязка не работает.

<ItemsControl Grid.Row="0" Grid.Column="1" Grid.RowSpan="8" ItemsSource="{Binding Words}"> 
<ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <WrapPanel /> 
    </ItemsPanelTemplate> 
</ItemsControl.ItemsPanel> 

<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <TextBox Text="{Binding Word}" Width="125" Height="25" /> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 
</ItemsControl> 

Я видел один пост, который говорит об использовании этого типа связывания ниже, но, видимо, я не понимаю FindAncestor, так что я не знаю, если я нахожусь на правильном пути или нет с этим.

Text="{Binding Path=Word, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" 
+0

Свойство 'Word' выглядит как выбранный элемент. Почему вы хотите связать каждый TextBox.Text с тем же свойством? Вы имеете в виду ''? Это привяжет 'TextBox' к каждому элементу – dkozl

+0

Я имею в виду установить привязку каждого TextBox к каждому элементу и не понял, что о привязке, но когда я меняю привязку TextBox и запускаю его, я получаю следующую ошибку при установке NumberOfWords свойство: Двусторонняя привязка требует Path или XPath –

+0

смену привязки к 'Text = {{Binding Path =.} "' – dkozl

ответ

2

Вы не можете связываться с элементами в коллекции, а затем изменить сам элемент - вы можете изменить только свойства этого элемента через связывание. Другими словами, учитывая следующую коллекцию

[ "один", "два", "три"]

через связывания, такие как

<TextBox Text="{Binding Words[0]} /> <!-- the word "one" is displayed in the tb --> 

если вы измените «один "к "Derp" вы бы не изменить коллекцию в

[ "Derp", "два", "три"]

Чтобы применить это к вашему примеру, вы хотите привязать коллекцию к ItemsControl, а затем привязать шаблон к каждому экземпляру в коллекции и изменить свойства этого экземпляра.

Во-первых, создайте свою модель. Это содержит ваши данные и то, что вы связываете в пользовательском интерфейсе.

public sealed class Word 
{ 
    public uint Value {get;set;} 
} 

Далее, выложите их на модель View.

public sealed class ViewModel 
{ 
    //create and fill in ctor 
    public ObservableCollection<Word> WordsYo {get;private set;} 
} 

Далее связать ItemsSource вашего ItemsControl к этой собственности и связать элементы в шаблоне свойств Word:

<!-- Window.DataContext is set to an instance of ViewModel --> 
<ItemsControl ItemsSource="{Binding WordsYo}"> 
<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <TextBox Text="{Binding Value}" /> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 
</ItemsControl> 

аристократов.

+0

Отлично работает! Спасибо, что объяснили, как вы ... сделали очень легко следовать. –

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