Комбо-бокс wpf не привязан к коллекции внутри ContentTemplate - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь показать определенный элемент управления на основе свойства (выпадающий список или текстовое поле). Итак, я реализовал этот контентконтроль:

   <!--<ComboBox MaxWidth="200" Background="#333333" ItemsSource="{Binding ModelObjectWrapper.Values}" Grid.Row="1" Grid.Column="1"/>-->
    <ContentControl Grid.Row="1" Grid.Column="1">
        <ContentControl.Resources>
            <Style TargetType="ContentControl">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ModelObjectWrapper.ObjType}" Value="typeA">
                        <Setter Property="ContentTemplate">
                            <Setter.Value>
                                <DataTemplate>
                                    <ComboBox HorizontalAlignment="Left" MaxWidth="200" Background="#333333" ItemsSource="{Binding ModelObjectWrapper.Values, UpdateSourceTrigger=PropertyChanged}"/>
                                </DataTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ModelObjectWrapper.ObjType}" Value="typeB">
                        <Setter Property="ContentTemplate">
                            <Setter.Value>
                                <DataTemplate>
                                    <TextBox />
                                </DataTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentControl.Resources>
    </ContentControl>

Проблема в том, что в комбинированном ящике не отображаются какие-либо элементы, когда он входит в контрольную таблицу, и я знаю, что в связанном списке они есть, поэтому я предполагаю, что комбинированный список не привязан к ItemsSource правильно. Первая строка (имеющая только выпадающий список без шаблонов), закомментированная, работает нормально. Разве я не делаю обязательство правильно? Может ли быть так, что из-за того, что он входит в сборщик данных, он не получает права DataContext? Я должен отметить, что DataTrigger сам по себе прекрасно работает (IE показывает комбинированный список, если *.ObjType == "typeA".

ВМ - это класс-оболочка вокруг объекта:

public class ModelObjectWrapper : ViewModelBase
{
private theModelObject model_obj;

public ModelObjectWrapper(theModelObject obj)
{
    model_obj = obj;
}       

public ObservableCollection<string> Values
{
    get { return model_obj.Values; }
    set
    {
        if (value == model_obj.Values)
            return;

        model_obj.Values = value;
        OnPropertyChanged();
    }
}
}

1 Ответ

0 голосов
/ 06 ноября 2018

DataContext корневого элемента в ContentControl - это Content того же ContentControl. Попробуйте использовать RelativeSource для привязки к свойству ContentControl DataContext:

<ComboBox HorizontalAlignment="Left" MaxWidth="200" Background="#333333" 
          ItemsSource="{Binding DataContext.ModelObjectWrapper.Values, RelativeSource={RelativeSource AncestorType=ContentControl}}"/>

Кстати, нет смысла устанавливать UpdateSourceTrigger привязки ItemsSource к PropertyChanged, потому что ComboBox никогда не устанавливает свойство источника.

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