Как вы можете динамически установить DataContext в C # -коде? - PullRequest
1 голос
/ 10 ноября 2011

Я построил RibbonGroupBox следующим образом в файле C #:

public class TextControl : RibbonGroupBox
{
    public TextControl()
    {
        const double widthOfComboBoxes = 150;

        Binding fontsBinding = new Binding();
        fontsBinding.Source = (TextControlVM)DataContext;
        fontsBinding.Path = new System.Windows.PropertyPath("Fonts");
        fontsBinding.Mode = BindingMode.TwoWay;

        Binding fontSizeBinding = new Binding();
        fontSizeBinding.Source = (TextControlVM)DataContext;
        fontSizeBinding.Path = new System.Windows.PropertyPath("FontSize");
        fontSizeBinding.Mode = BindingMode.TwoWay;

        /* Combobox for the fonts (Arial, etc.) */
        Fluent.ComboBox fontCombo = new Fluent.ComboBox();
        fontCombo.SetBinding(Fluent.ComboBox.ItemsSourceProperty, fontsBinding);
        fontCombo.SelectedItem = ((TextControlVM)DataContext).DefaultFont;
        fontCombo.Width = widthOfComboBoxes;
        this.AddChild(fontCombo);

        /* Combobox for the fontsizes */
        Fluent.ComboBox fontSizeCombo = new Fluent.ComboBox();
        fontSizeCombo.SetBinding(Fluent.ComboBox.ItemsSourceProperty, fontSizeBinding);
        fontSizeCombo.SelectedItem = ((TextControlVM)DataContext).DefaultFontSize;
        fontSizeCombo.Width = widthOfComboBoxes;
        this.AddChild(fontSizeCombo);
    }
}

Кроме того, у меня есть модель представления (TextControlVM), которая содержит свойства для шрифтов, FontSize, DefaultFont и DefaultFontSize.

Когда я сейчас использую это в другом модуле, как этот, DataContext в приведенном выше примере имеет значение null:

<Fluent:RibbonTabItem Header="Export">
    <TextControl DataContext="{Binding DataContext.TextControl}"/>
</Fluent:RibbonTabItem>

Когда я собираю RibbonGroupBox с кодом XAML, все работает нормально, поэтому я хочу сделать то, что автоматически делает XAML. Как я могу это сделать?

Справочная информация: я хочу использовать RibbonGroupBox в нескольких модулях. Вот почему я создаю его с C # -Code, чтобы я мог получить к нему динамический доступ. DataContext будет меняться в зависимости от вызова.

1 Ответ

0 голосов
/ 10 ноября 2011

DataContext подразумевается в привязке автоматически, поэтому вы по сути привязываетесь к RibbonTabItem.DataContext.DataContext.TextControl, которого не существует

Чтобы связать с RibbonTabItem.DataContext.TextControl, просто оставьте лишние DataContext вне привязки

<Fluent:RibbonTabItem Header="Export">
    <TextControl DataContext="{Binding TextControl}"/>
</Fluent:RibbonTabItem>
...