Почему Binding не обновляется - PullRequest
1 голос
/ 17 ноября 2010

Фон

Резюме того, что у меня есть, - UserControl MarkdownEditor.Он содержит TextBox, который имеет свойства отображения, такие как FontFamily, Background и т. Д., Контролируемые привязками.Он получает эти значения из класса MarkdownEditorOptions, который содержит свойства для каждого из этих значений.Мой код выглядит следующим образом:

In ShellView, показывая, как можно настроить параметры отображения для TextBox в моем MarkdownEditor

<me:MarkdownEditor>
    <me:MarkdownEditor.Options>
        <me:MarkdownEditorOptions Background="Red" />
    </me:MarkdownEditor.Options>
</me:MarkdownEditor>

In MarkdownEditor.xaml.cs, DataContext для MarkdownEditor (UserControl), объявление для Options

public MarkdownEditorOptions Options
{
    get { return (MarkdownEditorOptions)GetValue(OptionsProperty); }
    set { SetValue(OptionsProperty, value); }
}

public static readonly DependencyProperty OptionsProperty =
    DependencyProperty.Register("Options", typeof(MarkdownEditorOptions), typeof(MarkdownEditor), new UIPropertyMetadata(new MarkdownEditorOptions()));

In MarkdownEditor.xaml: указывается, как TextBox связывается сЗначения параметров

<TextBox Grid.Row="1" x:Name="txtEditor" AcceptsReturn="True" Text="{Binding Path=Content, UpdateSourceTrigger=PropertyChanged}" 
            FontFamily="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MarkdownEditor}}, Path=Options.FontFamily}"
            FontSize="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MarkdownEditor}}, Path=Options.FontSize}"
            FontWeight="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MarkdownEditor}}, Path=Options.FontWeight}"
            Background="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MarkdownEditor}}, Path=Options.Background, Converter={StaticResource colorToBrushConverter}}"
            Foreground="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MarkdownEditor}}, Path=Options.Foreground, Converter={StaticResource colorToBrushConverter}}" />

Класс MarkdownEditorOptions

// MarkdownEditorOptions
public class MarkdownEditorOptions : ObservableObject
{
    protected FontFamily _fontFamily;
    protected int _fontSize;
    protected FontWeight _fontWeight;
    protected Color _background;
    protected Color _foreground;

    // Constructor, for default options
    public MarkdownEditorOptions()
    {
        _fontFamily = new FontFamily("Consolas");
        _fontSize = 14;
        _fontWeight = FontWeights.Bold;
        _background = new Color { R = 32, G = 32, B = 32, A = 255 };
        _foreground = new Color { R = 255, G = 255, B = 255, A = 255 };
    }

    public FontFamily FontFamily {
        get { return _fontFamily; }
        set {
            _fontFamily = value;
            RaisePropertyChanged("FontFamily");
        }
    }

    public int FontSize
    {
        get { return _fontSize; }
        set {
            _fontSize = value;
            RaisePropertyChanged("FontSize");
        }
    }

    public FontWeight FontWeight
    {
        get { return _fontWeight; }
        set {
            _fontWeight = value;
            RaisePropertyChanged("FontWeight");
        }
    }

    public Color Background
    {
        get { return _background; }
        set {
            _background = value;
            RaisePropertyChanged("Background");
        }
    }

    public Color Foreground
    {
        get { return _foreground; }
        set {
            _foreground = value;
            RaisePropertyChanged("Foreground");

        }
    }
}

Проблема

Мой TextBox в MarkdownEditor всегда показывает значения по умолчанию из конструктора MarkdownEditorOptions.В простом XAML, который я показал, красный фон, кажется, не применяется.В чем дело?

[Обновление: 17 ноября: 16:25]

Несколько мыслей

Я думаю, что это как-то связано с Path=Options.FontSize.Возможно, эта привязка будет отслеживать изменения в Options вместо Options.FontSize?

ОБНОВЛЕНИЕ: 19 ноября

Несколько замечаний: если я использую элемент управления в отдельном простом окне

<Window ...>
    <Window.Resources>
        <me:MarkdownEditorOptions FontFamily="Arial" FontWeight="Normal" Background="Red" x:Key="options" />
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions ... />
        <Button Content="Options ..." Grid.Row="0" Click="Button_Click" />
        <me:MarkdownEditor Grid.Row="1" Options="{StaticResource options}" x:Name="markdownEditor" />
    </Grid>
</Window>

Все работает хорошо, если я использую его в более сложной настройке.TabControl привязано к ObservableCollection<TabViewModel>, сбой

<TabControl ... ItemsSource="{Binding TabsViewSource}" IsSynchronizedWithCurrentItem="True">

Я пробовал с и без привязок.Кажется, что сеттеры в MarkdownEditorOptions запущены, как я добавил Debug.WriteLine(), но фон и т. Д. Не обновляются.

<DataTemplate DataType="{x:Type vm:EditorTabViewModel}">
    <!--<me:MarkdownEditor Options="{Binding RelativeSource={RelativeSource AncestorType={x:Type v:ShellView}}, Path=ViewModel.Options}" />-->
    <me:MarkdownEditor>
        <me:MarkdownEditor.Options>
            <me:MarkdownEditorOptions Background="Red" />
        </me:MarkdownEditor.Options>
    </me:MarkdownEditor>
</DataTemplate>

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

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

0 голосов
/ 28 ноября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...