如何绑定在DataGrid中嵌套的ComboBox

时间:2015-04-17 00:15:50

标签: wpf data-binding combobox

我正在尝试同时学习WPF和MVVM,并需要一些绑定帮助。我仍然试图将绑定控件绑定到类的属性。

这是我的Malfunctions ViewModel:

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

我有一个DataGrid,它绑定到Malfunctions ViewModel中的AllPartMalfunctions ObservableCollection。这种绑定效果很好。

我有另一个嵌套在RowDetailsTemplate中的DataGrid,它绑定到PartMalfunction模型中的AllPartSerials。这种绑定也很好。

我的问题在于嵌套DataGrid中的组合框。我想将这个组合框绑定到Malfunctions ViewModel中的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>

2 个答案:

答案 0 :(得分:2)

类似的做法一直困在我的案子中。我意识到一个具有不同视图模型结构。

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

即使在DataTemplate中,绑定也能自然地工作。希望这适合您的域名。

答案 1 :(得分:1)

将与Malfunctions绑定的元素赋予Name并使用相对路径绑定,如下面的包含ComboBox的行所示。我假设我的例子是StackPanel包含DataGrid,StackPanel绑定到容器视图模型的Malfunctions属性。

<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" />
    ...
    ...