gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:34:51 30 4
gpt4 key购买 nike

我的代码在启动时失败,因为 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com