WPF为comboBox ItemsSource提供了不同的dataContext

时间:2014-05-03 15:28:33

标签: wpf mvvm combobox

我有一个ItemControl,里面有一个comboBox,我想要实现的是为comboBox itemsSource提供不同的dataContext

这是我的itemControl:

<ItemsControl ItemsSource="{Binding Types}" Margin="0,25,0,0" >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                    <DockPanel Margin="8">
                        <Border CornerRadius="6" BorderBrush="Gray" Background="LightGray" BorderThickness="2" DockPanel.Dock="Top">
                            <StackPanel >
                                <StackPanel Orientation="Horizontal" Margin="10">
                                    <TextBlock Text="Name:" FontSize="15" FontWeight="SemiBold"/>
                                    <TextBox Text="{Binding Name}" Width="70" Margin="10,0,0,0"/>
                                </StackPanel>
                                <StackPanel Orientation="Horizontal" Margin="10">
                                    <TextBlock Text="Type:" FontSize="15" FontWeight="SemiBold"/>
                                    <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.EmployeeStatus}"
                                              SelectedValue="{Binding Type}" Width="70" Margin="10,0,0,0"/>
                                </StackPanel>
                                <StackPanel Orientation="Horizontal" Margin="10">
                                    <TextBlock Text="Units:" FontSize="15" FontWeight="SemiBold"/>
                                    <TextBox Text="{Binding Units}" Width="70" Margin="10,0,0,0"/>
                                </StackPanel>
                                <StackPanel Orientation="Horizontal" Margin="10">
                                    <TextBlock Text="Range:" FontSize="15" FontWeight="SemiBold"/>
                                    <TextBox Text="{Binding Range}" Width="70" Margin="10,0,0,0"/>
                                </StackPanel>
                                <StackPanel Orientation="Horizontal" Margin="10">
                                    <TextBlock Text="Scale:" FontSize="15" FontWeight="SemiBold"/>
                                    <TextBox Text="{Binding Scale}" Width="70" Margin="10,0,0,0"/>
                                </StackPanel>
                                <StackPanel Orientation="Horizontal" Margin="10">
                                    <TextBlock Text="Reason:" FontSize="15" FontWeight="SemiBold"/>
                                    <TextBox Text="{Binding Reason}" Width="70" Margin="10,0,0,0"/>
                                </StackPanel>
                                <StackPanel Orientation="Horizontal" Margin="10">
                                    <TextBlock Text="Description:" FontSize="15" FontWeight="SemiBold" />
                                    <TextBox Text="{Binding Description}" Width="70" Margin="10,0,0,0"/>
                                </StackPanel>
                            </StackPanel>
                        </Border>
                    </DockPanel>
                </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

我看到类似的东西,但无法解决我的问题

WPF ComboBox bind itemssource to different datacontext in MVVM

2 个答案:

答案 0 :(得分:1)

解决方案1:每个ComboBox都有不同的项目

您必须使用ComboBox项目源创建适当的类型。

示例:

public class MyType
{
    public string Name { get; set; }
    public List<string> Types { get; set; }
    public string Type { get; set; }
    //...
}

现在您可以将ComboBox项目源绑定到不同的源:

<ItemsControl ItemsSource="{Binding Types}" Margin="0,25,0,0" >
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <DockPanel Margin="8">
                <Border CornerRadius="6" BorderBrush="Gray" Background="LightGray" BorderThickness="2" DockPanel.Dock="Top">
                    <StackPanel >
                        <StackPanel Orientation="Horizontal" Margin="10">
                            <TextBlock Text="Name:" FontSize="15" FontWeight="SemiBold"/>
                            <TextBox Text="{Binding Name}" Width="70" Margin="10,0,0,0"/>
                        </StackPanel>
                        <StackPanel Orientation="Horizontal" Margin="10">
                            <TextBlock Text="Type:" FontSize="15" FontWeight="SemiBold"/>
                            <ComboBox ItemsSource="{Binding Path=Types}"
                                      SelectedValue="{Binding Type}" Width="70" Margin="10,0,0,0"/>
                        </StackPanel>
                        ...
</ItemsControl>

Here您可以找到示例解决方案。

解决方案2:所有ComboBox都有相同的项目

public class MyType
{
    public string Name { get; set; }       
    public string Type { get; set; }
}

class MyViewModel
{        
    private List<MyType> _types;
    public List<MyType> Types
    {
        get { return _types; }
        set { _types = value; }
    }
    public List<string> TypesItemsSource { get; set; }
}

XAML代码:

<ItemsControl ItemsSource="{Binding Types}" Margin="0,25,0,0" >
<ItemsControl.ItemTemplate>
    <DataTemplate>
        <DockPanel Margin="8">
            <Border CornerRadius="6" BorderBrush="Gray" Background="LightGray" BorderThickness="2" DockPanel.Dock="Top">
                <StackPanel >
                    <StackPanel Orientation="Horizontal" Margin="10">
                        <TextBlock Text="Name:" FontSize="15" FontWeight="SemiBold"/>
                        <TextBox Text="{Binding Name}" Width="70" Margin="10,0,0,0"/>
                    </StackPanel>
                    <StackPanel Orientation="Horizontal" Margin="10">
                        <TextBlock Text="Type:" FontSize="15" FontWeight="SemiBold"/>
                            <ComboBox ItemsSource="{Binding Path=DataContext.TypesItemsSource, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"
                                  SelectedValue="{Binding Type}" Width="70" Margin="10,0,0,0"/>
                    </StackPanel>
                    ...
</ItemsControl>

Here您可以找到示例解决方案。

答案 1 :(得分:0)

我使用&#34;标记接口&#34;找到正确的datacontext

public interface IDataContextMarker{} //just an empty interface

所以在viewmodel绑定的视图中实现此接口

public class MyView : IDataContextMarker {}

现在你可以使用带有relativesource绑定的接口而不是控件或者ancestorlevel,这使得某些情况更容易:)

<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:IDataContextMarker}}, Path=DataContext.EmployeeStatus}"