Caliburn.micro DataGridComboBoxColumn not binding
本文关键字:binding not DataGridComboBoxColumn micro Caliburn | 更新日期: 2023-09-27 18:36:40
我之前读过很多文章来问这个问题,但最后我决定写在这里,因为我找不到适合我的解决方案。
我对视图有以下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>
这是我的视图模型的一部分:
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; }
}
我的用户模型具有此属性:
public string Language
{
get { return _language; }
set
{
if (_language != value)
{
_language = value;
NotifyOfPropertyChange(() => Language);
}
}
}
如何绑定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 ItemsSource={Binding ElementName=UsersCollection, Path=DataContext.Languages} SelectedItemBinding={Binding Path=Language} />
</DataGrid.Columns>
如果其中包含DataGrid
的视图具有名称,例如,如果您的DataGrid
位于具有名称myUserControl
的UserControl
内,请尝试以下小修改:
<DataGridComboBoxColumn ItemsSource={Binding ElementName=myUserControl, Path=DataContext.Languages} SelectedItemBinding={Binding Path=Language} />
</DataGrid.Columns>
如果包含 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 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>
实际上对我有用。