我正在尝试同时学习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>
答案 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" />
...
...