为什么MVVM / WPF ComboBox SelectedItem在多绑定到其他控件的可见性时为空?

时间:2015-04-01 14:17:53

标签: wpf xaml mvvm multibinding

编辑:我绑定到组合框绑定到的相同属性(SearchType) - >工作良好。我仍然想知道为什么我这里描述的第一个解决方案不起作用。

我有

public enum SearchType
{
    NetworkObjects,
    Customers
}

在ViewModel构造函数中:

public  SearchViewModel()
{
    SearchType = Panels.SearchType.NetworkObjects;

在xaml:

<UserControl.Resources>
    <xpui:ConvertSearchTypeToVisibility x:Key="searchtypetovisibilityconverter" />
</UserControl.Resources>

<ComboBox
            Name="SearchTypeComboBox"
            ItemsSource="{Binding Path=SearchTypes}"
            SelectedItem="{Binding Path=SearchType, Mode=TwoWay}">
...
<DataGrid.Visibility>
   <MultiBinding Converter="{StaticResource searchtypetovisibilityconverter}">
       <Binding RelativeSource="{RelativeSource Self}" Path="Name"/>
           <Binding ElementName="SearchTypeComboBox" Path="SelectedItem" />
   </MultiBinding>
</DataGrid.Visibility>

转换器:

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    string gridName = (string)values[0];
    SearchType searchType = (SearchType)values[1];

在转换方法中,值有2个项,值[1] == null。此外,如果我带走绑定SelectedItem是在ViewModel构造函数中设置的SearchType.NetworkObjects。我做错了什么?

2 个答案:

答案 0 :(得分:1)

我希望您尚未发布的代码出现问题。我使用提供的代码编写了一个具有非常相似行为的解决方案,除非我删除了values[1] == null绑定,否则不存在ComboBox.SelectedItem的情况。

Here是工作样本。

答案 1 :(得分:1)

问题在于平台中的InitializeComponent在我使用的平台设置DataContext之前被调用。因此,使用未绑定(默认)值调用Converter,在这种情况下,SelectedItem为null。解决方案是检查values-array,尤其是值[1],如果值为null(或者除SearchType之外的任何内容),则返回Bindin.DoNothing。

猜猜这是一般的好习惯。感谢@Neil和@NETScape指出这一点。

   public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values != null && values.Length == 2 && values[0] is string && values[1] is SearchType)
        {
            string gridName = (string)values[0];
            SearchType searchType = (SearchType)values[1];

            if ((gridName == "ObjectSearchResults" && searchType == SearchType.NetworkObjects) ||
                (gridName == "CustomerSearchResults" && searchType == SearchType.Customers))
            {
                return Visibility.Visible;
            }
            return Visibility.Collapsed;
        }
        return Binding.DoNothing;
    }