Свойство настройки привязки, но интерфейс не обновляется. Могу ли я отлаживать в указанном проекте / контроле? - PullRequest
1 голос
/ 20 ноября 2010

У меня есть пользовательский элемент управления с привязками, как показано ниже

<DataTemplate DataType="{x:Type vm:EditorTabViewModel}">
    <me:MarkdownEditor 
        Options="{Binding Path=Options, RelativeSource={RelativeSource AncestorType=Window}}" />
</DataTemplate>

Я считаю, что привязка (Window1.Options) устанавливается (после перехода по коду в режиме отладки), параметры редактора уценки (предполагается, чтоset Fonts, Colors и т. д.) не устанавливается или, по крайней мере, пользовательский интерфейс не обновляется.Я хочу показать, что происходит в MarkdownEditor.xaml.cs, но это другой (на который ссылаются) проект.Как я могу убедиться, что MarkdownEditor.Options установлен по крайней мере?

Я на самом деле проверил, что сторона MarkdownEditor работает по следующему

<Window ...>
    <Grid>
        <Button Content="Options" Click="Button_Click" Grid.Row="0" />
        <me:MarkdownEditor Options="{Binding Options, RelativeSource={RelativeSource AncestorType=Window}}" Grid.Row="1" />
    </Grid>
</Window>

Так что разница в том, что последний MarkdownEditor просто в Grid в Window.Единственный сбой - MarkdownEditor в пределах TabControl, привязанный к ObservableCollection<TabViewModel>

Решение Visual Studio, воспроизводящее проблему

Я не очень хорошо объясняюВ общем, простой проект, который я составил, минус весь ненужный шум, загруженный в media fire , чтобы вы могли взглянуть на то, что не так

Видео, показывающее проблемуна Screenr

Простое использование редактора в окне / сетке.

привязка работает нормально

Затем при использовании вместе с TabControl, привязанным к ObservableCollection<EditorTabViewModel>, привязка работает, как показано в 2 TextBox обновляет свои значения.но редактор не обновляет

1 Ответ

5 голосов
/ 20 ноября 2010

После прочтения ответа Кента Бугаарта на этот вопрос я думаю, что правильное место для изменения SetValue на SetCurrentValue находится не в свойстве CLR, а в конструкторе для MarkDownEditor.

public MarkdownEditor()
{
    InitializeComponent();
    //Options = new MarkdownEditorOptions();
    this.SetCurrentValue(OptionsProperty, new MarkdownEditorOptions());
    DataContext = this;
}

На самом деле, это будет работать так же хорошо без этого. SetCurrentValue также, так как параметры будут устанавливаться через привязку.

Чтобы убедиться, что Binding действительно перезаписан SetValue, вы можете добавить этот код в какое-то событие для TabUsage (например, PreviewMouseRightButtonDown для TextBox FontSize), и Binding снова начнет работать.

private void TextBox_PreviewMouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    MarkdownEditor.MarkdownEditor editor = VisualTreeHelpers.GetVisualChild<MarkdownEditor.MarkdownEditor>(this);
    Binding binding = new Binding();
    binding.Path = new PropertyPath("Options");
    binding.Source = this;
    binding.Mode = BindingMode.TwoWay;
    editor.SetBinding(MarkdownEditor.MarkdownEditor.OptionsProperty, binding);
}
...