WPF MultiBinding in Convertor fails ==> DependencyProperty.UnsetValue

前端 未结 5 994
故里飘歌
故里飘歌 2020-12-31 10:23

My code fails at at startup because the values array in the Converter that is called by the Multibinding is not filled with proper value bu

相关标签:
5条回答
  • 2020-12-31 10:59

    When you set a list in any ItemsSource, the DataTemplate's DataContext for the individual items will each item of the list.

    True that your TextBlock binding is working correctly, because the DataContext is set to your main object: PageViewModel

    But in your DataTemplate the DataContext will be set to PageNumberViewModel, since these are the items in your collection.

    Therefor, the binding to Path=CurrentPage.Page_Number will result to UnsetValue, because CurrentPage is not a property of PageNumberViewModel

    Hope this clarifies things!

    If you truly wish to bind to the CurrentPage property of your Window's DataContext, consider using an ElementName binding:

    Give window a name, bind to

    <Binding ElementName="name" Path="DataContext.CurrentPage.Page_Number" />
    

    or use a RelativeSource binding:

    <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}" Path="DataContext.CurrentPage.Page_Number" />
    
    0 讨论(0)
  • 2020-12-31 10:59

    I also encountered this problem and found a solution in another post (https://stackoverflow.com/a/3139397/500099). The key is to use the FallbackValue="" property like this:

    <MultiBinding Converter="{StaticResource StringFormatConverter}">
        <Binding Path="ResultValueControl.Min" FallbackValue=""/>
        <Binding Path="Format" />
    </MultiBinding>
    
    0 讨论(0)
  • 2020-12-31 11:03

    DependencyProperty.UnsetValue is merely a constant on the DependencyProperty class.

    You can do something like this :

     if (values[1] == DependencyProperty.UnsetValue)
     {
         return null;  // or default value
     }
    
    0 讨论(0)
  • 2020-12-31 11:05

    I have just Changed in MainWindow.xaml as per Mr.Arcturus's suggestion and its working fine.

    Thank you so much Mr.Arcturus.

    you can see ManiWindow.xaml after chage

    <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 RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}" Path="DataContext.CurrentPage.Page_Number" />** 
                                </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" />
            <Button Content="Button" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="121,110,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
        </Grid>
    </Window>
    
    0 讨论(0)
  • 2020-12-31 11:19

    It looks like you might not have the correct DataContext to resolve the path CurrentPage.Page_Number. A good way of debugging this sort of thing is to remove the path so that you can inspect the DataContext within your value converter:

    <Binding Path="." />
    

    Then set a breakpoint in your ButtonColorConverter and have a look at exactly what you are trying to convert.

    0 讨论(0)
提交回复
热议问题