- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的代码在启动时失败,因为 Multibinding
调用的 Converter
中的值数组 未填充正确的值,但值为 DependencyProperty.UnsetValue
。
看看 Convertor 并看看我在哪里出错
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();
}
}
您可以下载full code或按照下面查看我的代码片段。
MainWindow.xaml
<Window x:Class="DataPager.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:Local="clr-namespace:DataPager.Convertor_For_BackGround">
<Grid>
<Grid.Resources>
<Local:ButtonColorConverter x:Key="currentPageSetter"/>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="36*" />
<RowDefinition Height="275*" />
</Grid.RowDefinitions>
<ItemsControl Name="pageControl" ItemsSource="{Binding Path=PageCollection}" Grid.Row="0">
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<Border >
<StackPanel>
<ItemsPresenter></ItemsPresenter>
</StackPanel>
</Border>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemsPanel x:Uid="pageItemTemplate">
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button x:Name="pageNumberButton" Margin="3,4" Content="{Binding Path=Page_Number}">
<Button.Background>
<MultiBinding Converter="{StaticResource currentPageSetter}">
<Binding Path="Page_Number" />
<Binding Path="CurrentPage.Page_Number" /> **//This Binding not resolves properly**
</MultiBinding>
</Button.Background>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBox Text="{Binding Path=CurrentPage.Page_Number,Mode=TwoWay, FallbackValue=asdf}" Grid.Row="1" Height="23" Margin="79,62,257,0" Name="textBox1" VerticalAlignment="Top" Width="167" />
</Grid>
</Window>
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<PageNumberViewModel> m_pageCollection = new ObservableCollection<PageNumberViewModel>();
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<PageNumberViewModel> 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 绑定(bind)工作正常,因为 DataContext 设置为您的主要对象:PageViewModel
但在您的 DataTemplate 中,DataContext 将设置为 PageNumberViewModel
,因为这些是您集合中的项目。
因此,绑定(bind)到 Path=CurrentPage.Page_Number
将导致 UnsetValue,因为 CurrentPage 不是 PageNumberViewModel
的属性
希望这能澄清事情!
如果您确实希望绑定(bind)到窗口 DataContext 的 CurrentPage 属性,请考虑使用 ElementName 绑定(bind):
给窗口一个名字,绑定(bind)到
<Binding ElementName="name" Path="DataContext.CurrentPage.Page_Number" />
或使用 RelativeSource 绑定(bind):
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}" Path="DataContext.CurrentPage.Page_Number" />
关于c# - 转换器中的 WPF MultiBinding 失败 ==> DependencyProperty.UnsetValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6786629/
我有一个包含只读 DependencyProperty 的类。从这个类中,我想绑定(bind)到只读 DependencyProperty到另一个只读 DepenendencyProperty另一个类
我有一个带有 ComboBox 的控件: 这是PropertyChangedCallback为属性(property) SelectedTrace在包含 ComboBox 的 OuterContro
我是 WPF/MVVM 的新手,我发现的示例似乎没有涵盖我面临的问题。 我有一个用于管理相当复杂的业务配置对象的屏幕。在 MVVM 中,我认为这意味着我应该具有以下内容: 具有接近于零逻辑的 XAML
我正在探索 WPF 世界,我在网上找到了一个关于如何在 xml 上使用绑定(bind)的好例子 http://www.codeproject.com/Articles/37854/How-to-Per
我有一个自定义类 MyPerson。所有(相关)属性都实现 INotifyPropertyChanged。 我创建了一个 UserControl 来显示它,一切正常。绑定(bind)到 MyPerso
我试图在我的代码中使用 tis 依赖属性,但它给了我错误,说默认值类型与属性“MyProperty”的类型不匹配。 但 short 应该接受 0 作为默认值。 如果我尝试给它一个 null 作为默认值
我在我的用户控件中定义了这样的属性: public bool IsSelected { get { return (bool)GetValue(IsSelectedProperty);
在我的用户控件中: public ODIF.DeviceChannel Channel { get { return (ODIF.DeviceChannel)GetValue(ChannelD
我在 WPF 应用程序的 ViewModel 中有这个简单的示例: class VM_DiskPartition : DependencyObject { // (...) Other
在previous post中我问如何将属性注册为 DependencyProperty。我得到了答案并且效果很好。 但现在我想在单击时向此 DependencyProperty 添加一些项目。这是行
我有两个对象绑定(bind)到同一个 dependencyProperty(在 Silverlight 中)。有没有办法确定这两个对象中的哪一个改变了属性?我想根据这些信息采取不同的行动。 不幸的是,
我正在将 XAML 序列化为文件并再次读取它(使用 XamlWriter 和 XamlReader)。 如果从未为元素设置 DependencyProperty(如 FrameworkElement
我有一个名为 ChartView 的用户控件。我有一个 ObservableCollection 类型的属性。我在 ChartView 中实现了 INotifyPropertyChanged。 Cha
虽然网络上的大多数代码示例都使用 DependencyProperties 的静态声明,但我发现在某些情况下它们被定义为公共(public)只读实例成员。 将 DependencyProperty 定
我有析构函数问题。这是重现问题的代码: class DPDemo : DependencyObject { public DPDemo() { } ~DPDemo()
在我的 XAML 中,我有一个带有 DependencyProperty 的对象: 我还有MouseUp处理程序 TextBlock .我如何获得 OverWidth属性值在里面? 最佳答案 这似乎
我正在创建一个模仿 AppBarButton 的自定义控件(但具有自定义功能,因此我们无法从 AppBarButton 派生)。 我的问题是 AppBarButton 的 Icon 属性。该属性本身采
如何将属性名称(字符串形式)转换为 DependencyProperty? 我有一组属性名称、它的字符串值和一个 DependencyObject。现在我想将这些属性值设置为 DependencyOb
我的控件有一个映射到私有(private)变量的属性。设置属性时,我还需要存储某个其他变量。当属性的私有(private)变量由我自己的控制代码设置时,一定不会出现这种特殊处理。一切顺利。 我现在需要
我正在尝试创建一个用户控件,其中包含一些 DependencyProperties,这些属性会转发给用户控件中的子控件。经过几次尝试,我开始工作了。为了测试一个小例子。 在示例中,我有一个名为 Ctr
我是一名优秀的程序员,十分优秀!