Привязка данных 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>

and my code-behind.

    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";
    }
}

person BillyPilgrim    schedule 17.11.2010    source источник
comment
Ответы ниже все правильные. Вам действительно следует избавиться от DP и вместо этого использовать ViewModel. Передайте экземпляр вашей виртуальной машины в конструктор представления и назначьте контекст данных виртуальной машине. Вы можете увидеть, как я это делаю, здесь " title="хорошо отменить диалог шаблон mvvm wpf, как я могу это сделать"> stackoverflow.com/questions/4199162/   -  person ihatemash    schedule 17.11.2010


Ответы (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, как упоминалось в других ответах.

person Aaron McIver    schedule 17.11.2010
comment
Ему по-прежнему нужно уведомление об изменении. - person SLaks; 17.11.2010
comment
@SLaks В этом случае уведомление об изменении не требуется. Добавляя все вышеперечисленное, значение будет отображаться как запросы OP без реализации INotifyPropertyChanged или превращения его в DP. Если ОП хочет пойти дальше, тогда вопрос под рукой ... тогда да, все ставки сняты. - person Aaron McIver; 17.11.2010

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

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

EDIT: вам также необходимо выполнить привязку к свойству самого Window, например

<TextBlock Text="{Binding Path=SomeCopy, RelativeSource={RelativeSource Self}}" ... /> 
person SLaks    schedule 17.11.2010
comment
@engwar: чтобы увидеть это, переместите строку SomeCopy = перед InitializeComponent(). Теперь SomeCopy будет иметь значение до создания TextBlock и получит что-то от привязки. - person Tergiver; 17.11.2010
comment
-1 Это не текущая проблема, DataContext никогда не устанавливается, он равен нулю. - person Aaron McIver; 17.11.2010
comment
@Aaron: Это проблема a. Однако вы правы; Я пропустил это. Исправлена. - person SLaks; 17.11.2010

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

person Domenic    schedule 17.11.2010
comment
Обычные вызовы NotifyPropertyChanged не будут работать с объектами DependencyObject. - person SLaks; 17.11.2010
comment
@SLaks, не могли бы вы пояснить, что вы имеете в виду? Я не понимаю большинство аспектов этого предложения, например. что нормально в NotifyPropertyChanged звонках; какое отношение объекты зависимости имеют к свойствам зависимостей, или к OP, или к тому, что я опубликовал, или почему два существительных в вашем сообщении не работают вместе. - person Domenic; 17.11.2010
comment
Я не думаю, что вы можете вызывать события INotifyPropertyChanged для свойств, не зависящих от зависимостей, в объектах зависимостей (таких как класс Window). Другими словами, PostSharp здесь не поможет. - person SLaks; 17.11.2010