Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么MVVM/WPF组合框SelectedItem在与其他控件的多重绑定中为空';能见度如何?_Wpf_Xaml_Mvvm_Multibinding - Fatal编程技术网

为什么MVVM/WPF组合框SelectedItem在与其他控件的多重绑定中为空';能见度如何?

为什么MVVM/WPF组合框SelectedItem在与其他控件的多重绑定中为空';能见度如何?,wpf,xaml,mvvm,multibinding,Wpf,Xaml,Mvvm,Multibinding,编辑:我绑定到combobox绑定到的相同属性(SearchType)->工作正常。我仍然想知道为什么我在这里描述的第一个解决方案不起作用 我有 public enum SearchType { NetworkObjects, Customers } 在ViewModel Constructor中: public SearchViewModel() { SearchType = Panels.SearchType.NetworkObjects; 在xaml中: &l

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

我有

public enum SearchType
{
    NetworkObjects,
    Customers
}
在ViewModel Constructor中:

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>

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

我希望您没有发布的代码中出现了一些错误。我使用提供的代码编写了一个行为非常相似的解决方案,并且没有出现
值[1]==null
的情况,除非我删除了
组合框。SelectedItem
绑定


是工作示例。

问题在于,在我使用的平台设置DataContext之前,会调用平台内的InitializeComponent in code behind。因此,将使用未绑定(默认)值调用转换器,在本例中,SelectedItem的值为null。解决方案是检查values数组,尤其是values[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;
    }

什么是SearchType,其中是否存在SearchType.NetworkObjects?还有,你是否有例外;可以使用多数据绑定器吗?我会认为这是一种有效的方法。现在,您的控件依赖于视图模型,如果您删除了ComboBox,并且DataGrid依赖于它,它将无法编译。此外,它可能在控件初始化过程中显示为null,然后在呈现后不久设置。@matti您可以发布转换器的所有代码吗?我想我可能有一个答案,但不知道预期的行为是多少次,它击中转换器。什么时候应用数据上下文?有时我也会这样。我不确定这是100%,只是我的经验。但是不管怎样,很高兴能帮助你,非常感谢。我正在使用一个框架/平台和一个ViewModel类,问题可能就在那里。正如你所说的,问题在于转换器。测试值的条件应该在开始时(已经在问题中显示)。
   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;
    }