ComboBox в моей WPF DataGrid не будет отображать какие-либо элементы - PullRequest
0 голосов
/ 01 декабря 2011

У меня есть пользовательский элемент управления WPF, который содержит DataGrid.Эта группа содержит несколько столбцов, включая ComboBox для состояний.Список состояний заполняется и сохраняется как свойство в моей ViewModel.

Я пытаюсь привязать свойство StateList к ItemsSource моего Combobox, но когда я запускаю форму и пытаюсь редактировать DG, комбинированный ящикне содержит значений, поле со списком пустоетот же комбинированный список, этот комбинированный список работает, как и ожидалось.

<!-- this works as long as it's not in the DG -->
<StackPanel Height="126" HorizontalAlignment="Left" Margin="766,275,0,0" Name="stackPanel1" VerticalAlignment="Top" Width="200" >
    <ComboBox Name="cboState2"
          SelectedValuePath="StateKey"
          ItemTemplate="{StaticResource dtStateTemplate}"
          ItemsSource="{Binding StateList}" 
          SelectedItem="{Binding StateKey, Mode=TwoWay}"
          Width="100" />
</StackPanel>

Почему комбинированный список в DG не отображает значения из свойства StateList?Любой, почему отдельный комбинированный список работает должным образом?

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Это не работает, потому что ваш ComboBox ищет StateList как свойство DataContext DataGrid. То есть он пытается привязаться к ViewModel.AddressCollectionViewSource.View.StateList, когда он должен быть привязан к ViewModel.StateList. Проверьте ваше окно вывода во время отладки, и я уверен, что вы увидите ошибку привязки с эффектом Could not find property StateList on object AddressCollectionViewSource (or maybe ICollection).

Попробуйте вместо этого:

<ComboBox Name="cboState2" 
      SelectedValuePath="StateKey" 
      ItemTemplate="{StaticResource dtStateTemplate}" 
      ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,
            AncestorType={x:Type DataGrid}}, Path=DataContext.StateList}"  
      SelectedItem="{Binding StateKey, Mode=TwoWay}" 
      Width="100" /> 
1 голос
/ 02 декабря 2011

, если ваша viewmodel это свойство в окне, вы можете сделать это

ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=ViewModel.StateList, Mode=OneWay}"


<Window x:Class="WpfStackOverflowSpielWiese.Window2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window2"
        Height="300"
        Width="300"
        x:Name="window">

  <Grid DataContext="{Binding ElementName=window, Path=ViewModel}">

    <DataGrid x:Name="grid"
              AutoGenerateColumns="False"
              ItemsSource="{Binding AddressCollectionViewSource, Mode=OneWay}">

      <DataGrid.Columns>
        <DataGridTemplateColumn Header="State"
                                Width="160">

          <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
              <TextBlock Text="{Binding StateKey}" />
            </DataTemplate>
          </DataGridTemplateColumn.CellTemplate>

          <DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
              <StackPanel Orientation="Horizontal">
                <ComboBox Name="cboState"
                          SelectedValuePath="StateKey"
                          ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=ViewModel.StateList, Mode=OneWay}"
                          SelectedItem="{Binding StateKey, Mode=TwoWay}"
                          Width="100" />
              </StackPanel>
            </DataTemplate>
          </DataGridTemplateColumn.CellEditingTemplate>

        </DataGridTemplateColumn>
      </DataGrid.Columns>

    </DataGrid>
  </Grid>
</Window>


using System.Collections.ObjectModel;
using System.Windows;

namespace WpfStackOverflowSpielWiese
{
  /// <summary>
  /// Interaction logic for Window2.xaml
  /// </summary>
  public partial class Window2 : Window
  {
    public static readonly DependencyProperty ViewModelProperty =
      DependencyProperty.Register("ViewModel", typeof(ViewModelClass), typeof(Window2), new PropertyMetadata(default(ViewModelClass)));

    public ViewModelClass ViewModel {
      get { return (ViewModelClass)this.GetValue(ViewModelProperty); }
      set { this.SetValue(ViewModelProperty, value); }
    }

    public Window2() {
      this.InitializeComponent();
      this.grid.Items.Clear();
      this.ViewModel = new ViewModelClass();
    }
  }

  public class StateClass : DependencyObject
  {
    public static readonly DependencyProperty StateKeyProperty =
      DependencyProperty.Register("StateKey", typeof(string), typeof(ViewModelClass), new PropertyMetadata(default(string)));

    public string StateKey {
      get { return (string)this.GetValue(StateKeyProperty); }
      set { this.SetValue(StateKeyProperty, value); }
    }

    public static readonly DependencyProperty StateProperty =
      DependencyProperty.Register("State", typeof(string), typeof(StateClass), new PropertyMetadata(default(string)));

    public string State {
      get { return (string)this.GetValue(StateProperty); }
      set { this.SetValue(StateProperty, value); }
    }
  }

  public class ViewModelClass : DependencyObject
  {
    public static readonly DependencyProperty StateListProperty =
      DependencyProperty.Register("StateList", typeof(ObservableCollection<string>), typeof(ViewModelClass), new PropertyMetadata(default(ObservableCollection<string>)));

    public static readonly DependencyProperty AddressCollectionViewSourceProperty =
      DependencyProperty.Register("AddressCollectionViewSource", typeof(ObservableCollection<StateClass>), typeof(ViewModelClass), new PropertyMetadata(default(ObservableCollection<StateClass>)));

    public ObservableCollection<StateClass> AddressCollectionViewSource {
      get { return (ObservableCollection<StateClass>)this.GetValue(AddressCollectionViewSourceProperty); }
      set { this.SetValue(AddressCollectionViewSourceProperty, value); }
    }

    public ObservableCollection<string> StateList {
      get { return (ObservableCollection<string>)this.GetValue(StateListProperty); }
      set { this.SetValue(StateListProperty, value); }
    }

    public ViewModelClass() {
      this.StateList = new ObservableCollection<string>(new[] {"one", "two"});
      this.AddressCollectionViewSource = new ObservableCollection<StateClass>(new[] {new StateClass {State = "state", StateKey = "one"}});
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...