2016-01-11 2 views
2

Я пытаюсь выяснить правильный способ привязки ViewModel к ContentControl (я просмотрел всю сеть, но не могу найти пример, который я могу получить, чтобы работать правильно).MVVM Basic ContentControl Binding

My Model:

public class Model 
{ 

    private string _Variable = "TEST"; 
    public string Variable 
    { 
     get { return _Variable; } 
     set { _Variable = value; } 
    } 
} 

Мои ViewModel

public class ViewModel :ViewModelBase 
{ 
    private Model _Model = new Model(); 

    public string Variable 
    { 
     get { return _Model.Variable; } 
     set 
     { 
      if (_Model.Variable != value) 
      { 
       _Model.Variable = value; 
       RaisePropertyChanged("Variable"); 
      } 
     } 
    } 

My View/Window

<Window.DataContext> 
    <local:ViewModel /> 
</Window.DataContext> 

<Window.Resources> 
    <DataTemplate DataType="{x:Type System:String}"> 
     <TextBox/> 
    </DataTemplate> 
</Window.Resources> 

<StackPanel> 
    <ContentControl Content="{Binding Path=Variable}" /> 
</StackPanel> 

Таким образом, в сущности, у меня есть (или, по крайней мере, я считаю, у меня есть) набор содержимое ContentControl для свойства ViewModel «Variable», это строка типа, поэтому необходимо использовать только DataTemplate и отображается текстовое поле.

И это происходит ... Отображается текстовое поле! Однако текстовое поле пуст, и любые внесенные изменения не влияют на переменную.

Это означает, что я сделал ошибку в Batabinding, но я не понимаю, где. У меня такое чувство, что только потому, что мой DataTemplate отображает текстовое поле, ничто на самом деле не привязывает к нему строку, но это бит, который я потерял.

Спасибо за любую помощь/совет.

+0

Я был отвлечен прошлой ночью и неправильно понял ваш вопрос. Прошу прощения за то, что потратил ваше время. Я удалил свой ответ. Для этого случая вам вообще не нужен или нужен DataTemplate. Ответ Алока правильный, если ваше намерение не является чем-то относительно необычным. Если вы хотите отобразить строку, вы поместите ее в TextBlock или Label, но вы все равно не будете определять DataTemplate, который применяется к любой String в этом файле XAML - строки находятся повсюду в пользовательском интерфейсе! –

ответ

0

использование текстового поля, как показано ниже:

<TextBox Text="{Binding}" /> 
1

Вы не указали TextBox-х Text связывания, который полностью отделен от DataContext. Поскольку вы хотите, чтобы TextBox связывался со своим собственным DataContext, просто выполните это:

<TextBox Text="{Binding Path=.}"/>