列表框中的组合框和相关的数据绑定问题

时间:2017-08-21 17:40:40

标签: c# wpf mvvm combobox listbox

好的,正如我所说,我有一个ListBox中的ComboBox。这些都是控件(在Visual Studio 2010和MVVM中使用C#的WPF项目)。

我可以很好地创造它们。

ListBox包含一个名为IntWrapper的ObservableCollection,它只包含int和int。

ComboBox加载了一个名为MissionViewModel的ObservableCollection,它只是一个包含一些基本数据类型的类。

因此ListBox和ComboBox的ItemSource是不同的。

我可以使用按钮向ListBox添加项目,只需向ObservableCollection添加一个新的IntWrapper。在视觉上这给了我一个新的ComboBox,它被填充。

我无法弄清楚当我选择它时,如何让MissionViewModel的一个属性转到IntWrapper中的属性。

以前我只是在ListBox中使用了一个TextBox,它看起来像这样:

<ListBox x:Name="lbMissionsToGive" ItemsSource="{Binding MissionsToGive}" SelectedItem="{Binding SelectedMissionToGive}" ContextMenu="{StaticResource RemoveMissionToGiveMenu}">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <Border BorderThickness="2" BorderBrush="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" CornerRadius="5,5,5,5">
                                        <StackPanel Orientation="Horizontal">
                                                    <TextBlock Margin="1">Mission ID: </TextBlock>
                                            <TextBox Margin="1" Text="{Binding Int, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                                        </StackPanel>
                                    </Border>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>

我的(非工作)尝试,我用ComboBox替换TextBox是这样的:

<ListBox x:Name="lbMissionsToGive" ItemsSource="{Binding MissionsToGive}" SelectedItem="{Binding SelectedMissionToGive}" ContextMenu="{StaticResource RemoveMissionToGiveMenu}">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <Border BorderThickness="2" BorderBrush="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" CornerRadius="5,5,5,5">
                                        <StackPanel Orientation="Horizontal">
                                                <ComboBox DisplayMemberPath="MissionNameAndID" SelectedValuePath="Int" ItemsSource="{Binding MissionListViewModel.MissionVMs, Source={StaticResource Locator}}"></ComboBox>
                                        </StackPanel>
                                    </Border>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>

我原以为SelectedValuePath会是我想要的东西,但到目前为止这似乎不起作用(也许我的用法不正确)。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

SelectedValue的{​​{1}}属性绑定到ComboBox的{​​{1}}属性:

Int

如果IntWrapper属性具有公共setter并且<ComboBox DisplayMemberPath="MissionNameAndID" SelectedValuePath="Int" SelectedValue="{Binding Int}" ItemsSource="{Binding MissionListViewModel.MissionVMs, Source={StaticResource Locator}}" /> 的{​​{1}}属性与IntWrapper.Int属性的类型相同,则此方法应该有效Int

答案 1 :(得分:0)

我尝试根据您的描述为您的问题创建解决方案。为了帮助您获得更多资格,我们需要有关MissionViewModel及其中包含的属性的更多信息。

我想,你的Binding并没有指向正确的ViewModel。我尝试重新创建下面描述的内容,在我的例子中,组合框中填充了MissionVm类的Name属性。

这是XAML。在这里,我将ItemsSource Binding更改为直接指向父窗口的DataContext的ObservableCollection。

<ListBox x:Name="lbMissionsToGive" ItemsSource="{Binding MissionsToGive}" SelectedItem="{Binding SelectedMissionToGive}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Border BorderThickness="2" BorderBrush="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" CornerRadius="5,5,5,5">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding }"></TextBlock>
                        <ComboBox Margin="20" Width="50" ItemsSource="{Binding DataContext.MissionVMs, RelativeSource={RelativeSource AncestorType=Window}}" DisplayMemberPath="Name"></ComboBox>
                    </StackPanel>
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

这是基于您的描述的ViewModel:

public class ViewModel : INotifyPropertyChanged
{
    public ViewModel()
    {
        var vm1 = new MissionVM { Id = 1, Name = "111"};
        var vm2 = new MissionVM { Id = 2, Name = "222" };
        var vm3 = new MissionVM { Id = 3, Name = "333" };

        MissionVMs = new ObservableCollection<MissionVM> { vm1, vm2, vm3};

        MissionsToGive = new ObservableCollection<int> {1, 2, 3};
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public ObservableCollection<int> MissionsToGive { get; set; }

    public int SelectedMissionToGive { get; set; }

    public ObservableCollection<MissionVM> MissionVMs { get; set; }
}

public class MissionVM
{
    public int Id { get; set; }

    public string Name { get; set; }
}

这是输出:

enter image description here

我希望这会有所帮助。如果我误解了你,请进一步解释这个问题。