2013-10-24 2 views
0

Я прочитал много статей, прежде чем задавать вопрос, но, наконец, я решил написать здесь, потому что не смог найти тот, который может поместиться в моем решении.Caliburn.micro DataGridComboBoxColumn не является обязательным

У меня есть следующие DataGrid на Вид:

<DataGrid x:Name="UsersCollection" CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False" HorizontalAlignment="Center" VerticalAlignment="Top" Height="525" Width="510" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Canvas.Left="147" Canvas.Top="26" Margin="0"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Username, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/> 
      <DataGridTextColumn Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/> 
      <DataGridComboBoxColumn x:Name="Languages" /> 
     </DataGrid.Columns> 

И это часть моей ViewModel:

private List<string> _languages; 



    [ImportingConstructor] 
    public UsersViewModel() 
    { 
     DisplayName = "Users"; 
     _usersCollection = new TrulyObservableCollection<UserModel>(); 
     foreach (UserModel user in GetAllUsers()) 
      _usersCollection.Add(user); 

     _usersCollection.CollectionChanged += Users_CollectionChanged; 
     _usersCollection.ItemPropertyChanged += PropertyChangedHandler; 

     _languages = new List<string>(); 
     _languages.Add("es"); 
     _languages.Add("ca"); 
     _languages.Add("en"); 
    } 

    public List<string> Languages 
    { 
     get { return _languages; } 
    } 

Мои UserModel обладают этим свойством:

public string Language 
    { 
     get { return _language; } 
     set 
     { 
      if (_language != value) 
      { 
       _language = value; 
       NotifyOfPropertyChange(() => Language); 
      } 
     } 
    } 

Как это сделать, чтобы связать комбо DataGrid (конечно, связанный с свойством Language UserModel)? Заранее спасибо!

+0

Это несколько сбивает с толку, если я правильно вас понимаю, вы хотите привязать 'SelectedItem' к свойству' Language' и 'ItemsSource' к' Languages'. – UIlrvnd

+0

Ок, извините, я постараюсь сделать это лучше: я привязываю коллекцию UserModels к DataGrid. Одним из свойств каждого UserModel является язык. Я хочу изменить ячейку столбца, где привязано свойство «Язык» со списком с разными значениями. После этого INPC выпустит изменение. –

+0

Да, я отметил его после публикации, хотя он все еще не работает, спасибо! –

ответ

1

мне удалось запустить что-то:

<DataGrid x:Name="UsersCollection" CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False" HorizontalAlignment="Center" VerticalAlignment="Top" Height="525" Width="510" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Canvas.Left="147" Canvas.Top="26" Margin="0"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Username, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/> 
     <DataGridTextColumn Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/> 
     <DataGridComboBoxColumn Width="*"> 
      <DataGridComboBoxColumn.ElementStyle> 
      <Style TargetType="ComboBox"> 
       <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Languages}"/> 
       <Setter Property="SelectedItem" Value="{Binding Language}" /> 
      </Style> 
     </DataGridComboBoxColumn.ElementStyle> 
     <DataGridComboBoxColumn.EditingElementStyle> 
      <Style TargetType="ComboBox"> 
       <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.Languages}"/> 
       <Setter Property="SelectedItem" Value="{Binding Language}" /> 
      </Style> 
     </DataGridComboBoxColumn.EditingElementStyle> 
     </DataGridComboBoxColumn> 
    </DataGrid.Columns> 
</DataGrid> 

На самом деле работает для меня.

3

Попробуйте следующее, на ваш взгляд:

<DataGrid x:Name="UsersCollection" CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False" HorizontalAlignment="Center" VerticalAlignment="Top" Height="525" Width="510" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Canvas.Left="147" Canvas.Top="26" Margin="0"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Username, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/> 
     <DataGridTextColumn Binding="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/> 
     <DataGridComboBoxColumn ItemsSource={Binding ElementName=UsersCollection, Path=DataContext.Languages} SelectedItemBinding={Binding Path=Language} /> 
    </DataGrid.Columns> 

Если вид, в котором у вас есть DataGrid внутри имеет имя, как, например, если ваш DataGrid находится внутри UserControl, который имеет имя myUserControl, то попробуйте следующую небольшую модификацию:

<DataGridComboBoxColumn ItemsSource={Binding ElementName=myUserControl, Path=DataContext.Languages} SelectedItemBinding={Binding Path=Language} /> 
    </DataGrid.Columns> 

Если вид, содержащий DataGrid не имеет названия, просто дать ему один и использовать приведенный выше код.

+0

Спасибо, Снейфер, но он не работает. Эта проблема сводит меня с ума! –

+0

@OscarMateu Можете ли вы рассказать мне, что вы можете видеть в окне вывода при запуске приложения в режиме отладки. –

+0

@OscarMateu Я немного изменил свой ответ, пожалуйста, проверьте его. Я должен идти сейчас. Если у вас есть какие-либо вопросы или комментарии, просто оставьте их, и я отвечу позже, когда смогу. –

Смежные вопросы