2013-10-24 87 views
0

我之前已經閱讀了很多文章來問這個問題,但最後我決定寫在這裏,因爲我無法找到適合我的解決方案的文章。Caliburn.micro DataGridComboBoxColumn not binding

我有以下幾點上查看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組合(當然,與UserModel的Language屬性有關)?提前致謝!

+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視圖有一個名字,像例如,如果您DataGridUserControl具有名稱myUserControl裏面,然後試試下面的小修改:

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

如果包含DataGrid沒有名字,只是給它一個,並使用上面的代碼視圖。

+0

謝謝嗅探器,但它不起作用。這個問題讓我瘋狂! –

+0

@OscarMateu您可以告訴我在調試模式下運行應用程序時,您可以在輸出窗口中看到什麼。 –

+0

@OscarMateu我編輯了我的答案了一下,請檢查編輯。我必須現在去。如果您有任何問題或意見,請留下他們,我會盡快回復。 –