如何绑定在 DataGrid 中嵌套的 ComboBox

How to bind ComboBox found inside of a nested in DataGrid

我正在尝试同时学习 WPF 和 MVVM,需要一些绑定方面的帮助。我仍在努力思考将控件绑定到 class 的属性。

这是我的故障视图模型:

public class Malfunctions : ViewModelBase {
       public ObservableCollection<Model.PartMalfunction> AllPartMalfunctions {
            get;
            private set;
        }
       public ObservableCollection<Model.Part> AllParts {
        get;
        private set;
    }
}

这是 Model.PartMalfunction.cs:

public class PartMalfunction{
        public ObservableCollection<Model.PartSerial> AllPartSerials {
            get;
            set;
        }
    }

这里是 Model.Part.cs:

public class Part {
        public string Label { get; set; }
        public string Value { get; set; }
    }

我有一个绑定到故障视图模型中的 AllPartMalfunctions ObservableCollection 的 DataGrid。这个绑定工作得很好。

我在 RowDetailsTemplate 中嵌套了另一个 DataGrid,它绑定到 PartMalfunction 模型中的 AllPartSerials。此绑定也工作正常。

我的问题是嵌套 DataGrid 中的组合框。我想将此组合框绑定到故障视图模型中的 AllParts ObservableCollection。我该怎么做?

<DataGrid ItemsSource="{Binding AllPartMalfunctions}" AutoGenerateColumns="False" Width="Auto"
                        RowDetailsVisibilityMode="Visible">
    <DataGrid.Columns>
    <!--removed for brevity-->
    </DataGrid.Columns>
    <DataGrid.RowDetailsTemplate>
    <DataTemplate>
        <DataGrid ItemsSource="{Binding AllPartSerials }" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox Name="cboPart" VerticalAlignment="Center" ItemsSource="{Binding AllParts}" DisplayMemberPath="Label" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </DataTemplate>
    </DataGrid.RowDetailsTemplate>
</DataGrid>

类似的方法一直停留在我的案例中。我实现了一个具有不同视图模型结构的。

public class PartMalfunction{
    public ObservableCollection<Model.PartSerial> AllPartSerials {
        get;
        set;
    }
    public ObservableCollection<Model.Part> AllParts {
        get { return SomeStaticClass.AllParts; }
    }
}

即使在 DataTemplate 中,绑定也自然有效。希望这适合您的领域。

为绑定到 Malfunctions 的元素命名并使用相对路径进行绑定,如下面包含 ComboBox 的行所示。对于我的示例,我假设 StackPanel 包含 DataGrid,并且 StackPanel 绑定到容器视图模型的故障 属性。

<StackPanel x:Name="MalfunctionsGrid" DataContext={Binding Malfunctions}" Orientation="Vertical">
...
    <DataGrid ItemsSource="{Binding AllPartMalfunctions}" AutoGenerateColumns="False" Width="Auto"
                    RowDetailsVisibilityMode="Visible">
    ...
    ...
        <ComboBox Name="cboPart" VerticalAlignment="Center" ItemsSource="{Binding Path=DataContext.AllParts, ElementName=MalfunctionsGrid}" DisplayMemberPath="Label" />
    ...
    ...