转换器中的WPF MultiBinding失败==> DependencyProperty.UnsetValue

我的代码在启动时失败,因为Multibinding调用的Converter中的values数组没有填充适当的值但是具有 DependencyProperty.UnsetValue 的值

看看转换器,看看我在哪里得到错误

 public class ButtonColorConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { string val1 = string.Format(" {0} ", values[0]); string val2 = (string)values[1]; **//Here i am getting ==> {DependencyProperty.UnsetValue}** return val1.Equals(val2) ? Brushes.NavajoWhite : Brushes.White; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 

您可以下载完整代码或查看我的代码段,如下所示。

MainWindow.xaml

                                   

MainWindow.xaml.cs

  public partial class MainWindow : Window { public MainWindow() { MyPageViewModel = new PageViewModel(); MyPageViewModel.PageCollection.Add(new PageNumberViewModel(string.Format(" {0} ",0))); MyPageViewModel.PageCollection.Add(new PageNumberViewModel(string.Format(" {0} ",1))); MyPageViewModel.PageCollection.Add(new PageNumberViewModel(string.Format(" {0} ",2))); MyPageViewModel.PageCollection.Add(new PageNumberViewModel(string.Format(" {0} ",3))); InitializeComponent(); } public PageViewModel MyPageViewModel { get { return this.DataContext as PageViewModel; } set { this.DataContext = value; } } } 

这是ViewModel类。

PageViewModel.cs

 public class PageViewModel:ViewModelBase { private ObservableCollection m_pageCollection = new ObservableCollection(); private PageNumberViewModel m_currentPage = new PageNumberViewModel(string.Format(" {0} ",0)); public PageViewModel() { m_currentPage = new PageNumberViewModel(string.Format(" {0} ", 1000)); } public PageNumberViewModel CurrentPage { get { return this.m_currentPage; } set { if (m_currentPage == value) return; this.m_currentPage = value; base.OnPropertyChanged("CurrentPage"); } } public ObservableCollection PageCollection { get { return this.m_pageCollection; } set { if (m_pageCollection == value) return; this.m_pageCollection = value; base.OnPropertyChanged("PageCollection"); } } } 

PageNumberViewModel.cs

 public class PageNumberViewModel : ViewModelBase { private string m_pageNumber; public PageNumberViewModel() { } public PageNumberViewModel(string pageNumgerArg) { this.m_pageNumber = pageNumgerArg; } public string Page_Number { get { return m_pageNumber; } set { if (m_pageNumber == value) return; m_pageNumber = value; OnPropertyChanged("PageNumber"); } } } 

在任何ItemsSource中设置列表时,各个项目的DataTemplate的DataContext将列表中的每个项目。

确实,您的TextBlock绑定正常工作,因为DataContext设置为您的主对象: PageViewModel

但是在DataTemplate中,DataContext将设置为PageNumberViewModel ,因为它们是集合中的项目。

因此,绑定到Path=CurrentPage.Page_Number将导致UnsetValue,因为CurrentPage不是PageNumberViewModel的属性

希望这能澄清事情!

如果您真的希望绑定到Window的DataContext的CurrentPage属性,请考虑使用ElementName绑定:

给窗口命名,绑定到

  

或使用RelativeSource绑定:

  

看起来您可能没有正确的DataContext来解析路径CurrentPage.Page_Number 。 调试此类事情的一种好方法是删除路径,以便可以检查值转换器中的DataContext:

  

然后在ButtonColorConverter设置断点,并准确查看您要转换的内容。

我也遇到了这个问题,并在另一篇文章中找到了解决方案( https://stackoverflow.com/a/3139397/500099 )。 关键是使用FallbackValue =“”属性,如下所示:

     

DependencyProperty.UnsetValue只是DependencyProperty类的常量。

你可以这样做:

  if (values[1] == DependencyProperty.UnsetValue) { return null; // or default value } 

根据Mr.Arcturus的建议,我刚刚在MainWindow.xaml中进行了更改,并且工作正常。

非常感谢Mr.Arcturus。

你可以在chage之后看到ManiWindow.xaml