【问题标题】:Caliburn.micro DataGridComboBoxColumn not bindingCaliburn.micro DataGridComboBoxColumn 未绑定
【发布时间】:2013-10-24 14:59:42
【问题描述】:

我之前已经阅读了很多文章来问这个问题,但最后我决定在这里写,因为我无法找到适合我的解决方案的文章。

我在视图上有以下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属性有关)?提前致谢!

【问题讨论】:

  • 这有点令人困惑,如果我理解正确的话,您想将SelectedItem 绑定到Language 属性,并将ItemsSource 绑定到Languages
  • 好吧,抱歉,我会尝试做得更好:我将一组 UserModels 绑定到一个 DataGrid 中。每个 UserModel 的属性之一是 Language。我想可以更改将属性“语言”绑定到具有不同值的组合框的列的单元格。之后,INPC 将触发更改。
  • 是的,我发帖后注意到了,虽然还是不行,谢谢!

标签: c# wpf mvvm datagrid caliburn.micro


【解决方案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 ItemsSource={Binding ElementName=UsersCollection, Path=DataContext.Languages} SelectedItemBinding={Binding Path=Language} />
     </DataGrid.Columns>

如果您在其中包含 DataGrid 的视图有名称,例如,如果您的 DataGrid 位于名称为 myUserControlUserControl 中,则尝试以下小的修改:

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

如果包含DataGrid 的视图没有名称,只需给它一个名称并使用上面的代码。

【讨论】:

  • 谢谢 Sniffer,但它不起作用。这个问题快把我逼疯了!
  • @OscarMateu 你能告诉我当你在调试模式下运行应用程序时你能在输出窗口中看到什么吗?
  • @OscarMateu 我已经编辑了我的答案,请检查编辑。我得先走了。如果您有任何问题或 cmet,请留下他们,我会尽快回复。
  • 此错误显示在输出中:System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。 BindingExpression:Path=DataContext.Languages;数据项=空;目标元素是“DataGridComboBoxColumn”(HashCode=45180734);目标属性是“ItemsSource”(类型“IEnumerable”)
【解决方案2】:

我已经成功运行了一些东西:

<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>

实际上对我有用。

【讨论】:

    猜你喜欢
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2012-01-03
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多