转换器中的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
上述就是C#学习教程:转换器中的WPF MultiBinding失败==> DependencyProperty.UnsetValue分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
** **
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1003955.html