为什么 MVVM/WPF ComboBox SelectedItem 在多重绑定到其他控件的 Visibility 时为 null?
Why MVVM/WPF ComboBox SelectedItem is null in multibinding to other control's Visibility?
编辑:我绑定到组合框绑定到的相同 属性 (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];
在 Convert-method 值中有 2 个项目和值[1]==null。此外,如果我取消绑定,SelectedItem 是 SearchType.NetworkObjects,如 ViewModel 构造函数中所设置的那样。我做错了什么?
我预计您尚未发布的代码中存在问题。我使用提供的代码编写了一个具有非常相似行为的解决方案,并且没有 values[1] == null
除非我删除 ComboBox.SelectedItem
绑定。
Here 是工作样本。
问题是在我使用的平台设置 DataContext 之前调用后台代码中的平台 InitializeComponent。因此,使用未绑定(默认)值调用转换器,在本例中对于 SelectedItem 为 null。解决方案是检查值数组,尤其是值 [1] 和 return 和 Bindin.DoNothing 如果值为空(或除 SearchType 以外的任何值)。
我想这通常是个好习惯。感谢@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) -> 工作正常。我仍然想知道为什么我在这里描述的第一个解决方案不起作用。
我有
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];
在 Convert-method 值中有 2 个项目和值[1]==null。此外,如果我取消绑定,SelectedItem 是 SearchType.NetworkObjects,如 ViewModel 构造函数中所设置的那样。我做错了什么?
我预计您尚未发布的代码中存在问题。我使用提供的代码编写了一个具有非常相似行为的解决方案,并且没有 values[1] == null
除非我删除 ComboBox.SelectedItem
绑定。
Here 是工作样本。
问题是在我使用的平台设置 DataContext 之前调用后台代码中的平台 InitializeComponent。因此,使用未绑定(默认)值调用转换器,在本例中对于 SelectedItem 为 null。解决方案是检查值数组,尤其是值 [1] 和 return 和 Bindin.DoNothing 如果值为空(或除 SearchType 以外的任何值)。
我想这通常是个好习惯。感谢@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;
}