【问题标题】:How do you handle a ComboBox SelectionChanged in MVVM? Selection changed events are not firing.你如何处理 MVVM 中的 ComboBox SelectionChanged?选择更改事件不会触发。
【发布时间】:2015-10-30 04:38:20
【问题描述】:

组合框1

  <ComboBox Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Center" Margin="2,2,0,0" Name="comboBoxServer" VerticalAlignment="Top" Width="156" ItemsSource="{Binding Path=ServerNameList, Mode=OneWay}" SelectedIndex="0" SelectedItem="{Binding SelectedIndex}" SelectionChanged="comboBoxServer_SelectionChanged" Text="{Binding selectedServer, Mode=OneWayToSource,UpdateSourceTrigger=PropertyChanged}" >
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="SelectionChanged">
                        <i:InvokeCommandAction Command="{Binding serverCommand}" CommandParameter="{Binding ElementName=comboBoxServer, Path=SelectedValue}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </ComboBox>

组合框2

            <ComboBox Grid.Column="1" Grid.Row="2" Height="23" HorizontalAlignment="Center" Margin="2,2,0,0" Name="comboBoxDBName" VerticalAlignment="Top" Width="156" ItemsSource="{Binding Path=DBNameList, Mode=OneWay}" SelectedItem="{Binding serverSelected, Mode=TwoWay}" >

            </ComboBox>

我希望在第一个组合框中选择值时,第二个组合框应根据第一个组合框选择填充。

【问题讨论】:

  • 语句&lt;i:InvokeCommandAction Command="{Binding serverCommand}" CommandParameter="{Binding ElementName=comboBoxServer, Path=SelectedValue}"/&gt; 的输出窗口是否有绑定失败?
  • 没有。没有这样的失败..

标签: wpf events mvvm combobox selectionchanged


【解决方案1】:

由于您使用的是 MVVM,最简单的解决方案是将选定的 comboboxItem 逻辑放在其属性设置器中。 ViewModel 应该实现 INotifyPropertyChanged:

<ComboBox
    Grid.Row="0" Grid.Column="0" 
    ItemsSource="{Binding Path=AvailableItems}"
    SelectedValue="{Binding Path=SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    Margin="3" />

<ComboBox
    Grid.Row="1" Grid.Column="0" 
    ItemsSource="{Binding Path=AvailableServers}"
    SelectedValue="{Binding Path=SelectedServer, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
    Margin="3" />

属性可能如下所示:

private Item selectedItem;
public Item SelectedItem
{
    get { return selectedItem; }
    set
    {
        selectedItem = value;

        ChangeSelectedServer();
        OnPropertyChanged("SelectedItem");
    }
}

private void ChangeSelectedServer()
{
    switch(selectedItem)
    {
        case ...
            // your setting logic here...
            // like: SelectedServer = AvailableServers.Where(s => s.Id == selectedItem.Id).Single();
            break;
    }
}

private Item selectedServer;
public Item SelectedServer
{
    get { return selectedServer; }
    set
    {
        selectedServer = value;
        OnPropertyChanged("SelectedServer");
    }
}

或者你可以通过命令来实现这个,就像讨论过的here

【讨论】:

    猜你喜欢
    • 2010-10-31
    • 2012-02-03
    • 2012-01-29
    • 2011-06-28
    • 1970-01-01
    • 2015-09-29
    • 2021-03-17
    • 2014-03-26
    • 1970-01-01
    相关资源
    最近更新 更多