绑定设置属性但UI未更新.我可以在引用的项目/控件中调试吗?

Jie*_*eng 1 wpf binding user-controls

我有一个自定义控件与下面的绑定

<DataTemplate DataType="{x:Type vm:EditorTabViewModel}">
    <me:MarkdownEditor 
        Options="{Binding Path=Options, RelativeSource={RelativeSource AncestorType=Window}}" />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

我发现Window1.Options正在设置binding()(在调试模式中单步执行代码之后),markdown编辑器选项(应该设置字体,颜色等)没有设置,或者至少UI不会更新.我想知道发生了什么,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>
Run Code Online (Sandbox Code Playgroud)

所以区别在于后者MarkdownEditor只是一个Grid中的一个Window.失败的是MarkdownEditor一个TabControl受限制的ObservableCollection<TabViewModel>

Visual Studio解决方案复制问题

我不是很擅长解释事情,所以我编写的一个简单的项目减去了上传到媒体大火的所有不必要的噪音,所以你可以看看什么是错的

该视频显示了Screenr上的问题

只需一个简单的用法,窗口/网格中的编辑器.

绑定工作正常

然后,当与TabControl绑定结合使用时ObservableCollection<EditorTabViewModel>,绑定的工作方式如2 TextBoxes更新其值.但编辑器没有更新

Fre*_*lad 5

在阅读了Kent Boogaart对这个问题的回答后,我认为将SetValue更改为SetCurrentValue的正确位置不在CLR属性中,而是在MarkDownEditor的构造函数中.

public MarkdownEditor()
{
    InitializeComponent();
    //Options = new MarkdownEditorOptions();
    this.SetCurrentValue(OptionsProperty, new MarkdownEditorOptions());
    DataContext = this;
}
Run Code Online (Sandbox Code Playgroud)

事实上,由于没有this.SetCurrentValue,因此也可以通过Binding设置Options.

要验证您的Binding实际上已被SetValue覆盖,您可以在TabUsage的某些事件中添加此代码(例如,FontSize TextBox的PreviewMouseRightButtonDown),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);
}
Run Code Online (Sandbox Code Playgroud)