Основной вопрос по связям с WPF - PullRequest
1 голос
/ 18 декабря 2009

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

По сути, у меня есть строка в коде, за которой я хотел бы установить двустороннюю привязку с помощью текстового поля в моем графическом интерфейсе. Я подумал, что это простой вопрос создания DependencyProperty в коде, а затем привязать его к TextBox через привязку Source. Проблема в том, что я не могу понять одну или обе части правильно.

Вот мое определение DependencyProperty из кода:

    public static readonly DependencyProperty FilePathProperty = DependencyProperty.Register( "FilePath", typeof(string), typeof(Window1));
    public string FilePath
    {
        get { return (string)GetValue(FilePathProperty); }
        set { SetValue( FilePathProperty, value); }
    }

А вот и мой XAML:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ReportingInterface Test Application" Height="300" Width="536">

    <Menu DockPanel.Dock="Top">
        <MenuItem Name="menu_plugins" Header="File">
            <MenuItem Header="Open">
                <StackPanel Orientation="Horizontal">
                    <Label>File location:</Label>
                    <TextBox Name="text_filepath" Width="100" Text="{Binding Source=FilePath, Path=FilePath, Mode=TwoWay}"></TextBox>
                    <Button Margin="3" Width="20">...</Button>
                </StackPanel>
            </MenuItem>
        </MenuItem>
    </Menu>

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 18 декабря 2009

Когда вы определили привязку в XAML, она привязывается ко всему, что установлено как DataContext для объекта (или его родительского элемента).

Обычно это означает, что вы задали бы DataContext of Window для некоторого класса, и тогда связывание сработает:

<TextBox Name="text_filepath" Width="100" Text="{Binding Path=FilePath, Mode=TwoWay}" />

Вы можете исправить это, добавив в конструктор окна:

this.DataContext = this;

Это заставит работать привязку к самому окну.

Кроме того, вы можете настроить привязку для привязки к определенному исходному объекту. Если в этом случае вы хотели бы иметь возможность использовать что-то другое в качестве DataContext, но по-прежнему хотите привязать к свойству зависимости, определенному в вашем окне, вы можете сделать:

<TextBox Name="text_filepath" Width="100" Text="{Binding Path=FilePath, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"></TextBox>

Это работает, сообщая привязке найти первого предка типа «Окно» и связать его со свойством «FilePath» для этого объекта.

1 голос
/ 19 декабря 2009

Я бы порекомендовал изучить шаблон MV-VM (Model, View, ViewModel) - по сути, у вас есть этот класс, который служит в качестве DataContext для вашего XAML, и все ваши интересные выставленные свойства. / команды / то, что вы выставлены как открытые члены этого класса (называется ViewModel).

Вот хорошая обзорная веб-трансляция: MVVM видео

А вот еще один из MSDN mag: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

...