2013-08-28 36 views
0

不太确定如果我以错误的方式接近,无法看到解决方案,或者只是在wpf引擎中达到限制。我有一个用户控件,在一个网格,我正在尝试设置在控制范围之内的网格视图的DisplayMemberBinding,从调用它的控制:将约束表达式传递给usercontrol

用户控件:(剪断,为了简洁)

<UserControl x:Class="MyAssembly.UserControls.IncludedItems"> 
    <Grid> 
     <ListView x:Name="lstViewItems" Grid.Row="0" ItemsSource="{Binding AffectedFiles, FallbackValue={x:Null}}"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Width="90"> 
         <GridViewColumn.HeaderTemplate> 
          <DataTemplate> 
           <DockPanel> 
            <CheckBox Margin="5,2" IsChecked="{Binding Path=DataContext.AllSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, FallbackValue=false}" /> 
            <TextBlock Text="Include?" /> 
           </DockPanel> 
          </DataTemplate> 
         </GridViewColumn.HeaderTemplate> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <Grid Width="90"> 
            <CheckBox HorizontalAlignment="Center" IsChecked="{Binding ShouldInclude}" /> 
           </Grid> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
        <GridViewColumn 
         x:Name="gvcDisplayPath" 
         Header="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=ColumnHeader, FallbackValue=Path}" /> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </Grid> 
</UserControl> 

所以在gvcDisplayPath我希望能够设置的DisplayMemberPath,从呼叫控制:

<Window x:localControls="clr-namespace:MyAssembly.UserControls"> 
    <Grid> 
     ... 
     <localControls:IncludedItems DataContext="{Binding FallbackValue={StaticResource vmDesignModel}}" DisplayMemberPath="Catalog" ColumnHeader="Site" /> 
     ... 
    </Grid> 
</Window> 

我曾尝试在该控件设置代码隐藏在C tr和OnInitialised方法,基于依赖项属性,但没有奏效(因为dp尚未设置为该值)。

由于

+1

试图在设定它更改处理程序的依赖项属性? (假设您将DisplayMemberPath DP添加到IncludedItems控件 –

+0

您的'gvcDisplayPath'控件是一个'GridViewColumn'对象...'GridViewColumn'对象上没有'DisplayMemberPath'属性。请考虑您想要的内容并编辑您的 – Sheridan

+0

@NicholasW谢谢!知道我错过了什么,我会在一秒内发布我的解决方案 – Psytronic

回答

0

我的最终解决方案是钩到在所述用户控制的DependencyProperty登记PropertyChangedCallback,并更新从那里的结合(剪断为了简洁):

public partial class IncludedItems : UserControl { 

    public static readonly DependencyProperty DisplayMemberPathProperty = DependencyProperty.Register("DisplayMemberPath", typeof(string), typeof(TargetedItemView), new UIPropertyMetadata("Item", DisplayMemberPathPropertyChanged)); 

    private static void DisplayMemberPathPropertyChanged(object sender, DependencyPropertyChangedEventArgs e) { 
     IncludedItems view = sender as IncludedItems; 
     if (null == view) 
      return; 

     view.gvcDisplayPath.DisplayMemberBinding = new Binding(view.DisplayMemberPath) { TargetNullValue = String.Empty, FallbackValue = String.Empty }; 
    } 

}