Помогите с привязкой данных WPF - PullRequest
3 голосов
/ 14 июня 2011

Я новичок в WPF и пытаюсь выяснить, как работает привязка данных, но мне не очень повезло.

Я пытаюсь начать с чего-то простого - связать содержимое текстового поля со строковой переменной в моей программе.

Я прочитал множество страниц документации MSDN о привязке данных, пространствах имен XML, расширениях разметки, ресурсах, свойствах зависимостей и прочем, и все еще не могу заставить его работать.

Вот мой MainWindow.xaml:

<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:c="clr-namespace:WpfTest"
        Title="MainWindow">
    <Grid>
        <Grid.Resources>
            <c:Foo x:Key="MyFoo"/>
        </Grid.Resources>
        <TextBox Width="100" Height="28"
                 Text="{Binding Source=MyFoo,
                                Path=BarProperty,
                                Mode=TwoWay,
                                UpdateSourceTrigger=PropertyChanged}"/>
    </Grid>
</Window>

И мой MainWindow.xaml.cs:

namespace WpfTest
{
    public class Foo : DependencyObject
    {
        public static readonly DependencyProperty BarProperty = DependencyProperty.Register("Bar", typeof(String), typeof(Foo));

        public String Bar
        {
            get { return (String)GetValue(BarProperty); }
            set { SetValue(BarProperty, value); }
        }
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            MyFoo = new Foo { Bar = "hello" };
        }

        public Foo MyFoo { get; set; }
    }
}

Я ожидал бы, что в текстовом поле будет показано «привет» при запуске программы, но оно пустое.

Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 14 июня 2011

Вам нужно установить DataContext вашего окна на себя.

public MainWindow()
{
    InitializeComponent();
    this.DataContext = this;
    MyFoo = new Foo { Bar = "hello" };
}

Это говорит WPF искать привязки в вашем классе.

Каждый элемент управления может установить DataContext, который говорит: «когда я связываюсь, я хочу привязать свойство к этому конкретному экземпляру ... Это наследуется, поэтому если вы установите DataContext MainWindow в само по себе все элементы управления внутри MainWindow будут привязаны к свойствам MainWindow.

1 голос
/ 14 июня 2011

Вам необходимо указать источник. Или:

Дайте окну имя как Name = "mywin", измените вашу привязку с ElementName = "myWin"

Или установите окно DataContext следующим образом:

DataContext = "{Binding ElementName =" myWin "} - вы также можете использовать RelativeSource, если вы не хотите, чтобы имя, которое я просто не смог опубликовать, не проверялось - Привязки обычно требуют тестирования, как вы также заметили:)

Это может помочь:

http://blogs.msdn.com/b/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...