代码之家  ›  专栏  ›  技术社区  ›  Aleksey Pavlov

wpf绑定到父datacontext忽略当前元素的datacontext

  •  0
  • Aleksey Pavlov  · 技术社区  · 6 年前

    我想绑起来 Visibility 第一日和第二日的财产 StackPanel 父母的 DataContext 但是相反,它与 数据上下文 当前元素的。我怎么能忽视这个 数据上下文 并将绑定设置为 数据上下文 ?

    而且,MonthList必须忽略父级的 数据上下文 但不是这样的。

    <StackPanel 
        DataContext="{Binding dateOfProduction}"
        Orientation="Vertical"
        Grid.Row="10"
        Grid.Column="1">
        <StackPanel Orientation="Horizontal">
            <RadioButton Content="One date" Margin="5,0" IsChecked="{Binding Path=DateType, Converter={StaticResource enumBooleanConverter}, ConverterParameter=OneDate}"/>
            <RadioButton Content="Two date" Margin="5,0" IsChecked="{Binding Path=DateType, Converter={StaticResource enumBooleanConverter}, ConverterParameter=TwoDate}"/>
            <RadioButton Content="Not exists" Margin="5,0" IsChecked="{Binding Path=DateType, Converter={StaticResource enumBooleanConverter}, ConverterParameter=Empty}"/>
        </StackPanel>
        <StackPanel DataContext="{Binding Path=FirstDate}" Visibility="{Binding FirstDateExist, Converter={StaticResource booleanToVisibilityConverter}}" Orientation="Horizontal">
            <Label Width="37" Content="Day" />
            <TextBox VerticalContentAlignment="Center" Width="19" Text="{Binding Path=Day}"/>
            <Label Width="46" Content="Month" />
            <ComboBox Width="60"  ItemsSource="{Binding MonthList}" SelectedIndex="{Binding Path=Month}"/>
            <Label Width="29" Content="Year" />
            <TextBox VerticalContentAlignment="Center" Width="32" Text="{Binding Path=Year}"/>
            <Label Width="30" Content="Hour" />
            <TextBox VerticalContentAlignment="Center" Width="19" Text="{Binding Path=Hour}"/>
            <Label Width="51" Content="Minute" />
            <TextBox VerticalContentAlignment="Center" Width="19" Text="{Binding Path=Minute}"/>
        </StackPanel>
        <StackPanel DataContext="{Binding Path=SecondDate}" Visibility="{Binding SecondDateExist, Converter={StaticResource booleanToVisibilityConverter}}" Orientation="Horizontal">
            <Label Width="37" Content="Day" />
            <TextBox VerticalContentAlignment="Center" Width="19" Text="{Binding Path=Day}"/>
            <Label Width="46" Content="Month" />
            <ComboBox Width="60"  ItemsSource="{Binding MonthList}" SelectedIndex="{Binding Path=Month}"/>
            <Label Width="29" Content="Year" />
            <TextBox VerticalContentAlignment="Center" Width="32" Text="{Binding Path=Year}"/>
            <Label Width="30" Content="Hour" />
            <TextBox VerticalContentAlignment="Center" Width="19" Text="{Binding Path=Hour}"/>
            <Label Width="51" Content="Minute" />
            <TextBox VerticalContentAlignment="Center" Width="19" Text="{Binding Path=Minute}"/>
        </StackPanel>
    </StackPanel>
    

    下面您可以看到使用的类

    public class GoodsDate : PropertyChangedModels
    {
        private ComplexDate _FirstDate;
        public ComplexDate FirstDate
        {
            get { return _FirstDate; }
            set { _FirstDate = value; OnPropertyChanged("FirstDate"); }
        }
    
        private ComplexDate _SecondDate;
        public ComplexDate SecondDate
        {
            get { return _SecondDate; }
            set { _SecondDate = value; OnPropertyChanged("SecondDate"); }
        }
        public bool FirstDateExist
        {
            get => (FirstDate != null);
        }
        public bool SecondDateExist
        {
            get => (SecondDate != null);
        }
    }  
    public class ComplexDate : PropertyChangedModels
    {
        public ComplexDate(int? year = null, int? month = null, int? day = null, int? hour = null, int? minute = null)
        {
            Year = year;
            Month = month;
            Day = day;
            Hour = hour;
            Minute = minute;
        }
        private int? _Year;
        public int? Year
        {
            get { return _Year; }
            set { _Year = value?.LimitToRange(1000, 2999); OnPropertyChanged("Year"); }
        }
    
        private int? _Month;
        public int? Month
        {
            get { return _Month; }
            set { _Month = value?.LimitToRange(1, 12); OnPropertyChanged("Month"); }
        }
    
        private int? _Day;
        public int? Day
        {
            get { return _Day; }
            set { _Day = value?.LimitToRange(1, 31); OnPropertyChanged("Day"); }
        }
    
        private int? _Hour;
        public int? Hour
        {
            get { return _Hour; }
            set { _Hour = value?.LimitToRange(0, 23); OnPropertyChanged("Hour"); }
        }
    
        private int? _Minute;
        public int? Minute
        {
            get { return _Minute; }
            set { _Minute = value?.LimitToRange(0, 59); OnPropertyChanged("Minute"); }
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   user1672994    6 年前

    从那时起,您将datacontext定义为 DataContext="{Binding Path=FirstDate}" 在第一个/第二个日期,所以 Visibility 属性正在尝试从set datacontext解析它。

    你的问题有多种解决方法。您可以实现

    1。 使用“可见性上的相对源”属性将绑定设置为父级。

    Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type StackPanel}}, Path=FirstDateExist, Converter={StaticResource booleanToVisibilityConverter}}"
    

    2。

    将StackPanel包装成网格并设置其可见性。在这种情况下,visiblity将绑定到顶部stackpanel的datacontext。

    <Grid  Visibility="{Binding FirstDateExist, Converter={StaticResource booleanToVisibilityConverter}}">
         <StackPanel DataContext="{Binding Path=FirstDate}" Orientation="Horizontal">
            <Label Width="37" Content="Day" />
            <TextBox VerticalContentAlignment="Center" Width="19" Text="{Binding Path=Day}"/>
            <Label Width="46" Content="Month" />
            <ComboBox Width="60"  ItemsSource="{Binding MonthList}" SelectedIndex="{Binding Path=Month}"/>
            <Label Width="29" Content="Year" />
            <TextBox VerticalContentAlignment="Center" Width="32" Text="{Binding Path=Year}"/>
            <Label Width="30" Content="Hour" />
            <TextBox VerticalContentAlignment="Center" Width="19" Text="{Binding Path=Hour}"/>
            <Label Width="51" Content="Minute" />
            <TextBox VerticalContentAlignment="Center" Width="19" Text="{Binding Path=Minute}"/>
        </StackPanel>
    </Grid>
    

    三。

    去除 datacontext=“{binding path=firstdate}” 并将级联控制绑定更改为 Text="{Binding FirstDate.Day}"