WPF通过MVVM中的另一个ComboBox更改一个ComboBox中的选定值

时间:2018-03-27 08:12:03

标签: c# wpf combobox

我遇到了问题。我首先在WPF中有两个组合框:

<ComboBox commands:PropertyChangeBehavior.Command="{Binding GetCurrentsModuleCommand}" SelectedIndex="0">
  <ComboBox.ItemsSource>
    <CompositeCollection>
      <ComboBoxItem IsEnabled="True">All</ComboBoxItem>
      <CollectionContainer Collection="{Binding Source={StaticResource ResourceKey=AxmModulesCombo}}" />
    </CompositeCollection>
   </ComboBox.ItemsSource>
 </ComboBox>
</StackPanel>

让我们称之为Source,它被绑定到命令:

public ICommand GetCurrentsModuleCommand => new Command(module =>
{
   SelectedAxmModule = module.ToString();
   Stuff(module);
});

这个组合框没有SelectItem属性(因为参数只传递给方法,所以不需要任何参数)。

目标CombxBox

<ComboBox ItemsSource="{Binding AxmModules}" 
    SelectedItem="{Binding SelectedAxmModule, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
    SelectedValuePath="{Binding SelectedAxmModules}"
    IsSynchronizedWithCurrentItem="True"/>

Witch SelectedItem属性绑定到:

private string selectedAxmModule;
public string SelectedAxmModule
{
    get => selectedAxmModule;
    set
    {
       selectedAxmModule = value;
       OnPropertyChanged();
    }
 }

现在这些组合框的值是相似的,现在我想要做的是如果我在源命令中看到我在源代码中看到的值时我想要从源中选择相同的值(我从源处理值而不是在代码中的目标中处理值)这是无关紧要的。)

我尝试添加Update属性和SelectedValuePath但是在从源中选择值后,目标组合框中没有好的值仍为空,而OnPropertyChange按照有意义工作。有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:1)

如果AxmModulesIEnumerable<byte>,则SelectedAxmModule应为byte属性。您无法将string属性设置为byte值。类型必须匹配。

使用SelectedValuePath时,SelectedItem是多余的。

答案 1 :(得分:0)

因为你有

IsSynchronizedWithCurrentItem="True"/>

然后,选择项应该是当前的。您应该使用collectionview的当前项而不是绑定selecteditem。 你可以在这里阅读更多,可能比你想要阅读的更多关于collectionview和这类东西: https://social.technet.microsoft.com/wiki/contents/articles/26673.wpf-collectionview-tips.aspx

另外。 见这个

SelectedValuePath="{Binding SelectedAxmModules}"

selectedvaluepath是一个不是绑定的字符串。它应该是您要使用的字段的名称。 无论出于何种原因,如果要绑定到集合中的当前项,则可以使用/表示法。 https://social.technet.microsoft.com/wiki/contents/articles/29859.wpf-tips-bind-to-current-item-of-collection.aspx

我不确定这是如何适合复合收藏品的。我更喜欢一个单独的控件来表示选择&#34; all&#34;因此不会以这种方式使用复合集合。您可能想要自己考虑这种方法。