2010-11-17 2 views
0

Какая простая вещь мне не хватает? Почему моя копия не отображается на экране?глупый вопрос с привязкой WPF

<Window x:Class="DeleteThis.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" > 
<Grid> 

    <StackPanel> 

     <TextBlock Text="{Binding Path=SomeCopy}" Height="35" Width="100" Margin="10"/> 


    </StackPanel> 
</Grid> 

и мой код-позади.

public partial class MainWindow : Window 
{ 


    private string _someCopy; 
    public string SomeCopy 
    { 
     get 
     { 
      return _someCopy; 
     } 

     set 
     { 
      _someCopy = value; 
     } 
    } 

    public MainWindow() 
    { 

     InitializeComponent(); 

     SomeCopy = "why doesn't this display"; 
    } 
} 
+0

Все ответы ниже. Вы действительно должны избавиться от DP и вместо этого использовать ViewModel. Передайте экземпляр вашей виртуальной машины в конструктор View и назначьте datacontext для виртуальной машины. Вы можете видеть, как я это делаю здесь http://stackoverflow.com/questions/4199162/ok-cancel-dialog-mvvm-pattern-wpf-how-can-i-do-it/4201604#4201604 – ihatemash

ответ

1

WPF никогда не узнает, что имущество изменилось.

Чтобы исправить это, вы можете превратить это свойство в dependency property.

EDIT: Вам также нужно привязать к собственности на самой Window, как этот

ответ
<TextBlock Text="{Binding Path=SomeCopy, RelativeSource={RelativeSource Self}}" ... /> 
+0

@engwar : Чтобы увидеть этот ход, 'SomeCopy =' строка перед 'InitializeComponent()'. Теперь SomeCopy будет иметь значение до создания TextBlock, и он получит что-то из привязки. – Tergiver

+0

-1 Это не текущая проблема, DataContext никогда не устанавливается, она равна нулю. –

+0

@Aaron: Это проблема _a_. Однако вы правы; Я пропустил это. Исправлена. – SLaks

0

SLaks является правильным. Но создание свойств зависимостей вручную раздражает, поэтому я связываю вас с моим любимым решением: A custom PostSharp NotifyPropertyChangedAttribute, который при использовании в сочетании с PostSharp делает все свойства любого заданного класса зависимыми.

+0

Обычные вызовы 'NotifyPropertyChanged' не будут работать в DependencyObjects. – SLaks

+0

@SLaks, можете ли вы расширить то, что вы подразумеваете под этим? Я не понимаю большинства аспектов этого предложения, например. что «нормально» в отношении вызовов «NotifyPropertyChanged»; какие объекты зависимостей связаны с свойствами зависимостей или с OP или с тем, что я опубликовал, или почему два существительных в вашем сообщении не работают вместе. – Domenic

+0

Я не думаю, что вы можете создавать события NotifyPropertyChanged для свойств non-dependency в DependencyObjects (например, класс 'Window'). Другими словами, PostSharp здесь не поможет. – SLaks

3

Вы никогда не устанавливали DataContext окна. Изменение XAML к этому ...

<TextBlock Text="{Binding}" Height="35" Width="100" Margin="10"/> 

... и изменить свой код позади, чтобы добавить DataContext линию ...

public MainWindow() 
    { 
     InitializeComponent(); 

     SomeCopy = "why doesn't this display"; 

     this.DataContext = SomeCopy; 
    } 

Ваш текущий вопрос не имеет ничего общего с нуждаясь в DependencyProperty как упомянутых в других ответах.

+0

Ему все равно потребуется уведомление об изменении. – SLaks

+0

@SLaks Уведомление об изменении не требуется в этом случае. Добавляя все выше, значение будет отображаться как запросы OP без реализации INotifyPropertyChanged или создания DP. Если OP хочет идти дальше, то вопрос под рукой ... тогда да все ставки отключены. –

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