WPF MultiBinding in der Konverter fehlschlägt ==> DependencyProperty.UnsetValue
Meinen code nicht an beim starten, weil die Werte-array in der Converter
aufgerufen wird die Multibinding
ist nicht gefüllt mit dem richtigen Wert, sondern haben einen Wert von DependencyProperty.UnsetValue
.
haben Sie einen Blick auf Konverter und auch sehen, wo ich immer Fehler
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();
}
}
Können Sie herunterladen voller code oder siehe mein snippet-codes wie unten beschrieben.
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;
}
}
}
Und das ist auch ViewModel-Klassen.
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");
}
}
}
- Auch ohne Blick tiefer in den code würde ich dringend empfehlen, um zuerst zu testen, bevor Sie die execute (string)Werte[1] (immer Vorsicht vor der "magischen zahlen"), wenn a) Werte[] != null ist und b) wirklich ein Objekt enthält einen index von 1 (oder zumindest Werte.Länge > 0) , und c) das Objekt hat wirklich den gewünschten Typ STRING. Trigger ausgelöst werden, mre oft und dann unterschiedliche Werte enthalten, als Sie vielleicht erwarten, so dass immer überprüfen Sie Ihre Arrays, bevor Sie Sie verwenden, die direkt. Das könnte bereits helfen, Sie zu verhindern, dass Ihre Ausnahmen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie eine Liste in jedem ItemsSource, das DataTemplate ist DataContext für die einzelnen Elemente wird jedes Element der Liste.
Wahr, dass Ihr TextBlock Bindung richtig funktioniert, da der DataContext ist die Hauptsache:
PageViewModel
Aber in Ihrem DataTemplate DataContext gesetzt ist
PageNumberViewModel
, da diese Elemente in Ihrer Sammlung.Dafür, die Bindung an
Path=CurrentPage.Page_Number
Folge zu UnsetValue, weil CurrentPage ist nicht eine Eigenschaft vonPageNumberViewModel
Hoffe, das klärt die Dinge!
Wenn Sie wirklich wollen, zu binden, um die CurrentPage-Eigenschaft des Fensters ist DataContext, sollten Sie mithilfe einer ElementName-Bindung:
Fenster geben Sie einen Namen ein, binden
oder verwenden Sie eine RelativeSource binding:
Es sieht aus wie Sie möglicherweise nicht über die korrekten DataContext auf den Pfad auflösen
CurrentPage.Page_Number
. Eine gute Möglichkeit, die debugging-diese Art der Sache ist, entfernen Sie den Pfad, so dass Sie überprüfen können, den DataContext in Ihrem Wert Konverter:Legen Sie einen Haltepunkt in Ihrem
ButtonColorConverter
und haben einen Blick auf genau das, was Sie versuchen zu konvertieren.CurrentPage.Page_Number
zuTextBox
'sText
Eigenschaft, die es gut funktioniert. es gibt nur die Ausnahme, wenn wir Sie in Multibinding mit Konverter{DataPager.ViewModel.PageNumberViewModel}
als statt{DataPager.ViewModel.PageViewModel}
die ich zugeteilt habe alsDataContext
Dank.....DependencyProperty.UnsetValue
ist lediglich eine Konstante auf der DependencyProperty-Klasse.Können Sie etwas wie das hier tun :
Ich auch auf dieses problem und eine Lösung gefunden in einem anderen post (https://stackoverflow.com/a/3139397/500099). Der Schlüssel ist die Verwendung des FallbackValue="" Eigenschaft wie folgt:
Ich habe gerade im Hauptfenster.xaml als pro Herr Arcturus ist Vorschlag und seine Arbeitsmethoden in Ordnung.
Danke, dass Sie so viel Herr Arcturus.
können Sie sehen, ManiWindow.xaml nach chage