Как связать DataGridComboBoxColumn вне ItemSource - PullRequest
2 голосов
/ 23 февраля 2011

Я работаю над своим первым «производственным» WPF-приложением, и у меня возникла проблема.
У меня есть код, который похож на пример ниже. У меня проблема в том, что я не могу заставить ComboBox заполниться. Я предполагаю, что это потому, что Grid s ItemsSource "блокирует" ComboBox от возможности видеть коллекцию Tasks на ViewModel, но я только догадываюсь. Все остальное правильно привязано к данным.

Я отыскивал ТАК и нашел этот вопрос; это звучит так же, как то, что я пытаюсь сделать, но у меня это не сработало.

Есть идеи, почему я не могу заставить ComboBox заселить?

Модель:

public class Activity{
  public int Id { get; set; }
  public string Title { get; set; }
  public Task Task { get; set; }
}

public class Task{
  public int Id { get; set; }
  public string Title { get; set; }
}

ViewModel:

public ApprovalViewModel{
  public ObservableCollection<Activity> Activities { /* ... property logic */ }
  public ObservableCollection<Task> Tasks { /* ... property logic */ }
}

Вид:

<DataGrid ItemsSource="{Binding Activities}" AutoGenerateColumns="False">
    <DataGrid.Resources>
        <DataTemplate x:Key="displayTemplate">
            <TextBlock Text="{Binding Task.Title}"/>
        </DataTemplate>
        <DataTemplate x:Key="editTemplate">
            <ComboBox ItemsSource="{Binding Tasks}" <!--I think the problem is here-->
              SelectedValue="{Binding Task}"
              DisplayMemberPath="Title"/>
        </DataTemplate>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridComboBoxColumn DisplayMemberPath="Title"/>
        <DataGridTextColumn Binding="{Binding User}" Header="User"/>
        <DataGridTextColumn Binding="{Binding Task.Project.Title}" Header="Project"/>
        <DataGridTemplateColumn 
            Header="Task" 
            CellTemplate="{StaticResource displayTemplate}" 
            CellEditingTemplate="{StaticResource editTemplate}"/>
        <DataGridTextColumn Binding="{Binding Description}" Header="Description"/>
    </DataGrid.Columns>
</DataGrid>

Редактировать: правильный ComboBox код здесь:

<ComboBox 
  ItemsSource="{Binding Path=DataContext.Tasks, 
                        RelativeSource={RelativeSource FindAncestor, 
                                        AncestorType={x:Type UserControl}}}"
  SelectedValue="{Binding Task.Title}"
  SelectedValuePath="Title"
  DisplayMemberPath="Title"/>

1 Ответ

5 голосов
/ 23 февраля 2011

Вы правы в том, в чем проблема, что привязка относительно Activity. Так это ищет Activity.Tasks.

Правильный подход к сообщению, на которое вы ссылаетесь, вам просто нужно настроить его для вашей ситуации.

ItemsSource="{Binding Path=DataContext.Tasks, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" 

Это вернется к дереву Visual в поисках окна, которое имеет свойство DataContext.Tasks.

Ваш пример кода внутри окна? Если нет, вам нужно изменить {x: Type}, а во-вторых, установлен ли DataContext для этого объекта? Если нет, вам нужно установить его на ViewModel.

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