【问题标题】:Checked Combobox inside DataTemplate which is inside Listbox DataTemplate选中列表框 DataTemplate 内的 DataTemplate 内的 Combobox
【发布时间】:2017-05-25 17:19:46
【问题描述】:

我有一个列表框及其数据模板。但在它的 DataTemplate 中,我有 CheckedCombobox DataTemplate。想知道如何设置绑定。我尝试了以下方法来获取每个列表框项目在子元素中检查的项目。下面是不工作的代码。

<ListBox 
    Name="ListLayers" 
    ItemsSource="{Binding LstDragList}" 
    Height="123" 
    Width="283"
    SelectedIndex="{Binding SelectedRow, UpdateSourceTrigger=PropertyChanged, Mode=OneWayToSource}"
    >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <ComboBox 
                    Name="childlayers" 
                    Style="{StaticResource EditableCboStyle}" 
                    ItemsSource="{Binding lstLayerModel}"
                    Text="{Binding SelectedLayers, UpdateSourceTrigger=PropertyChanged}" 
                    ItemContainerStyle="{DynamicResource ComboboxItemContainerStyle}" 
                    Width="200" 
                    IsEditable="True" 
                    IsReadOnly="False"
                    PreviewMouseLeftButtonDown="ComboBox_PreviewMouseLeftButtonDown"
                    >
                    <ComboBox.ItemTemplate>
                        <DataTemplate DataType="{x:Type local:Model}">
                            <CheckBox 
                                VerticalAlignment="Center"
                                VerticalContentAlignment="Center"
                                IsChecked="{Binding IsChecked}"
                                Content="{Binding DisplayLayer}"
                                />
                        </DataTemplate>
                    </ComboBox.ItemTemplate>
                </ComboBox>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

型号:

public class DragList : ObservableObject
{
    public DragList()
    {
        _selectedLayers = string.Empty;
    }
    public string FileName { get; set; }
    public ObservableCollection<Model> lstLayerModel { get; set; }
    public string  Text { get; set; }

    private string _selectedLayers;

    public string SelectedLayers
    {
        get { return _selectedLayers; }
        set { SetAndNotify(ref _selectedLayers, value, () => this.SelectedLayers); }
    }

    private int _selectedLayerInx;

    public int SelectedLayerInx
    {
        get { return _selectedLayerInx; }
        set { SetAndNotify(ref _selectedLayerInx, value, () => this.SelectedLayerInx); }
    }

}

我的构造函数视图模型:

public ViewModel()
{
    _lstLayers = new ObservableCollection<Model>();
    mCheckedItems = new ObservableCollection<Model>();
    _tempDragList = new List<DragList>();

    _lstLayers.CollectionChanged += _lstLayers_CollectionChanged;
    _lstLayers.Add(new Model
    {
        LayerName = "All",
        LayerNumber = "",

        IsChecked = true
    });
    _lstLayers.Add(new Model { LayerName = "Layer one", LayerNumber = "1", IsChecked = false });
    _lstLayers.Add(new Model { LayerName = "Layer two", LayerNumber = "2", IsChecked = false });
    _lstLayers.Add(new Model { LayerName = "Layer three", LayerNumber = "3", IsChecked = false });

    _lstDragList = new List<DragList>();
    _lstDragList.Add(new DragList { FileName = "Test", lstLayerModel = _lstLayers });
    _lstDragList.Add(new DragList { FileName = "Test1", lstLayerModel = _lstLayers });

    _tempDragList = _lstDragList;
}

【问题讨论】:

  • 你能准确解释什么不起作用吗? LstDragList 实际上是视图模型中公共属性的名称吗?
  • 模型是否具有您要绑定的属性?
  • 在运行时使用 Snoop 检查绑定(以及相关的 DataContext)。
  • 我有一个列表,在这个模型中我有上面提到的 List。组合框的 IsChecked 属性在运行时与 List 绑定,我们有更多的 List 项,但是当我检查选中项的第一个组合框时,它也反映了与组合框选中属性的第二项相同的项。通常数据模板绑定应该与 List. 绑定

标签: wpf mvvm combobox datatemplate


【解决方案1】:

这是因为您需要在内部绑定上使用 RelativeSource 才能获得正确的 DataContext,如下所示:

{Binding DataContext.SelectedRow, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}

在 SO 上还有很多关于 RelativeSource 的其他文章,应该可以为您提供所需的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2011-08-16
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多