代码之家  ›  专栏  ›  技术社区  ›  Jiew Meng

绑定设置属性,但用户界面未更新。我可以在引用的项目/控件中调试吗?

  •  1
  • Jiew Meng  · 技术社区  · 14 年前

    我有一个自定义控件,绑定如下

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

    我发现那捆( Window1.Options )正在设置(在调试模式下逐步执行代码之后),标记编辑器选项(应该设置字体、颜色等)不会设置,或者至少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>
    

    所以区别在于后者是 标记编辑器 只是在一个 Grid 在一个 Window . 失败的是 标记编辑器 TabControl 绑定到 ObservableCollection<TabViewModel>

    Visual Studio解决方案复制问题

    我不是很擅长解释,所以我做了一个简单的项目减去所有不必要的噪音上传到 media fire 所以你可以看看有什么问题

    显示问题的视频 Screenr

    只需简单的使用,在窗口/网格中编辑。

    装订工作正常

    当与 选项卡控件 绑定到 ObservableCollection<EditorTabViewModel> ,绑定工作如2所示 TextBox es正在更新其值。但编辑没有更新

    1 回复  |  直到 14 年前
        1
  •  5
  •   Community CDub    8 年前

    在读了肯特·布加特的答案之后 this 问题我认为将SetValue更改为SetCurrentValue的正确位置不在CLR属性中,而在MarkDownEditor的构造函数中。

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

    事实上,如果没有this.SetCurrentValue,这也同样有效,因为选项将通过绑定设置。

    要验证您的绑定实际上已被SetValue覆盖,您可以在某些情况下为TabUsage添加此代码(例如,为FontSize文本框添加PreviewMouseRightButtonDown),绑定将重新开始工作。

    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);
    }