Что-то не так с моим свойством зависимости? Контент не установлен с привязкой - PullRequest
0 голосов
/ 19 ноября 2010

Интересно, что-то не так с моим свойством зависимости?

// In MarkdownEditor.xaml.cs, DataContext for MarkdownEditor.xaml
public string TextContent
{
    get { return (string)GetValue(TextContentProperty); }
    set { SetValue(TextContentProperty, value); }
}

public static readonly DependencyProperty TextContentProperty =
    DependencyProperty.Register("TextContent", typeof(string), typeof(MarkdownEditor), new UIPropertyMetadata(""));

Когда TextContent установлен в XAML как

<me:MarkdownEditor TextContent="{Binding TextContent}" Options="{Binding Options}" />

Не удается ... когда я

<me:MarkdownEditor TextContent="Hello world" Options="{Binding Options}" />

Работает ... Естьчто-то не так?Похоже, подобное происходит с опциями

ОБНОВЛЕНИЕ 1

Я замечаю, что переплет с обычным текстовым полем работает нормально

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

К вашему сведению: в MarkdownEditor.xaml

<TextBox Text="{Binding TextContent}" 
        FontFamily="{Binding Path=Options.FontFamily}"
        FontSize="{Binding Path=Options.FontSize}"
        FontWeight="{Binding Path=Options.FontWeight}"
        Background="{Binding Path=Options.Background}"
        Foreground="{Binding Path=Options.Foreground}" />

ОБНОВЛЕНИЕ 2

О!Интересно, когда я делаю

<me:MarkdownEditor TextContent="{Binding TextContent}" Options="{Binding Options}" />

Откуда взялись свойства TextContent & Options?MarkdownEditor ViewModel?

ОБНОВЛЕНИЕ 3

Еще несколько наблюдений:

Barebones

<me:MarkdownEditor />

TextContentбудет установлено значение из конструктора MarkdownEditor

public MarkdownEditor()
{
    InitializeComponent();
    DataContext = this;
    TextContent = "From MarkdownEditor.xaml.cs";
}

Статическое значение

<me:MarkdownEditor TextContent="Static Value" />

Строка "Статическое значение" отображается

Binding

<me:MarkdownEditor TextContent="{Binding Path=TextContent}" />

показано значение из объявления свойства зависимостей

public static readonly DependencyProperty TextContentProperty =
        DependencyProperty.Register(..., new UIPropertyMetadata("Default"));

Ответы [ 5 ]

3 голосов
/ 19 ноября 2010

Как вы устанавливаете DataContext в MarkdownEditor.xaml для привязок? Заданный вами DataContext может быть перезаписан определенным в вашем элементе управления DataContext, который использует MarkDownEditor. Таким образом, вы должны связать в MarkdownEditor.xaml, используя FindAncestor, в поисках UserControl (или того, что у вас есть как root).

EDIT: Это немного сбивает с толку то, что у вас есть. Я предполагаю следующее:

Вы определили UserControl с именем MarkdownEditor, с MarkdownEditor.xaml и выделенным кодом MarkdownEditor.xaml.cs. DataContext элемента управления задается с помощью this.DataContext = this; в конструкторе в MarkdownEditor.xaml.cs или DataContext="{Binding RelativeSource={RelativeSource Self}}" в корневом элементе в MarkdownEditor.xaml.

Во-вторых, у вас есть второй UserControl / Window / что угодно. Давайте назовем это MyControl. Он также имеет DataContext, который вы устанавливаете как-то . Затем вы связываете TextContent, как показано.

Так, в MarkdownEditor, {Binding TextContent} относится к DP в MarkdownEditor.xaml.cs. В MyControl {Binding TextContent} относится к свойству DataContext из MyControl . Поэтому вам следует проверить, есть ли у вас такое свойство в DataContext MyControl. Во-вторых, вы должны проверить, соответствует ли DataContext в MarkdownEditor тому, что вы ожидаете, или он был перезаписан.

1 голос
/ 19 ноября 2010

Меня за это побьют, но:

Вы пробовали это:

<TextBox Text="{Binding Path=TextContent}" 
        FontFamily="{Binding Path=Options.FontFamily}"
        FontSize="{Binding Path=Options.FontSize}"
        FontWeight="{Binding Path=Options.FontWeight}"
        Background="{Binding Path=Options.Background}"
        Foreground="{Binding Path=Options.Foreground}" />

(добавив "Path =" в ваш шаблон на этот раз) Я знаюЯ звучу как неработающая пластинка, но этот "Path =" дал мне немного головной боли не так давно, и мне действительно интересно, не связана ли ваша проблема с этим ...

1 голос
/ 19 ноября 2010

ты пробовал вот так?

<me:MarkdownEditor TextContent="{Binding Path=TextContent}" Options="{Binding Options}" />

(добавление "Path =")

0 голосов
/ 19 ноября 2010

Я не знаю, что такое или что делает MarkdownEditor, но я предполагаю, что вполне возможно, что MarkdownEditor не поддерживает двустороннее связывание данных по умолчанию. Укажите это явно в вашей разметке:

<me:MarkdownEditor TextContent="{Binding TextContent, Mode=TwoWay}" Options="{Binding Options}" />

Некоторые элементы управления XAML (например, TextBox) по умолчанию используют двустороннюю привязку - другими словами, изменения, внесенные в контекст данных, отражаются в элементе управления, а изменения, внесенные в элемент управления, отражаются в контексте данных. Другие элементы управления XAML по умолчанию используют одностороннее связывание. Я не уверен, что MarkdownEditor делает по умолчанию, но, если он использует одностороннюю привязку по умолчанию, я мог видеть, как изменения, внесенные в элемент управления, не отражаются в контексте ваших данных. Мне было бы интересно узнать, помогает ли в вашей ситуации явная установка режима привязки на TwoWay.

0 голосов
/ 19 ноября 2010

просто попробуйте с привязкой имени элемента

например.Дайте Окну x: name = MyWindow и используйте привязку элемента

<TextBlock Text="{Binding Path=Problem,ElementName=MyWindow}" />
...