2016-02-29 39 views
0

我创建ControlTemplates DataGrid的按钮触发:在DataGridDataTrigger绑定到财产的视图模型不

<Window.Resources> 
    <ControlTemplate x:Key="imgNo" TargetType="{x:Type Control}"> 
     <Image Source="pack://application:,,,/Images/up.png"/> 
    </ControlTemplate> 

    <ControlTemplate x:Key="imgUp" TargetType="{x:Type Control}"> 
     <!--<TextBlock Text="Up"/>--> 
     <Image Source="pack://application:,,,/Images/up.png"/> 
    </ControlTemplate> 

    <ControlTemplate x:Key="imgDown" TargetType="{x:Type Control}"> 
     <Image Source="pack://application:,,,/Images/downArrow.png"/> 
    </ControlTemplate> 

    <DataTemplate x:Key="ButtonOneDataTemplate"> 
     <Control x:Name="theControl" Template="{DynamicResource imgNo}" /> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding IsImageChanged}" Value="true"> 
       <Setter TargetName="theControl" Property="Template" Value="{DynamicResource imgUp}" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding IsImageChanged}" Value="false"> 
       <Setter TargetName="theControl" Property="Template" Value="{DynamicResource imgDown}" /> 
      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</WindowResources> 

Button它使用上述ControlTemplates

<DataGrid ItemsSource="{Binding Persons}" Grid.Row="1" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
    <DataGridTextColumn Binding="{Binding IdPerson}"> 
     <DataGridTextColumn.HeaderTemplate>       
      <DataTemplate> 
      <Border Background="Violet"> 
      <StackPanel> 
       <Button ContentTemplate="{StaticResource ButtonOneDataTemplate}" 
       Command="{Binding DataContext.HelloCommand, RelativeSource= 
        {RelativeSource AncestorType=Window}}" 
        CommandParameter="{Binding DataContext.Hello, 
       RelativeSource={RelativeSource AncestorType=DataGrid}}"/> 
      </StackPanel> 
      </Border> 
     </DataTemplate> 
     </DataGridTextColumn.HeaderTemplate>     
    </DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid>      

ViewModel

public class MainWindowViewModel:ViewModelBase 
{ 
    public RelayCommand HelloCommand { get; set; } 
    public MainWindowViewModel() 
    { 
     LoadPersons(); 
     HelloCommand = new RelayCommand(SayHello); 
    } 

    int helloCounter = 0; 
    private void SayHello(object obj) 
    { 
     if (helloCounter % 2 == 0) 
      IsImageChanged = true; 
     else 
      IsImageChanged = false;   
     helloCounter++; 
    } 


    private bool isImageChanged=true; 
    public bool IsImageChanged 
    { 
     get { return isImageChanged; } 
     set { isImageChanged = value; 
      OnPropertyChanged("IsImageChanged"); 
      } 
    } 
} 

我想要的是当我点击按钮<Button ContentTemplate="{StaticResource ButtonOneDataTemplate}"/>,然后Template应该被替换为{DynamicResource imgDown}{DynamicResource imgUp}DataTrigger取决于IsImageChanged的值。

但是,如果我点击Button,然后DataTrigger不解雇(ControltemplatesimgUpimgDown没有变化)。我怎样才能从我的ViewModel实现这一点?

+0

请提供完整的viewmodel代码。 。 – Gopichandar

+0

你仍然不清楚目标。你试图用这个来实现什么? – Gopichandar

+0

@Gopichandar请参阅我更新的问题 – StepUp

回答

1

问题是DataGrid列不是可视化树的一部分,因此它不会继承DataContext。为了能够在你的ButtonOneDataTemplate中使用DataTrigger,你需要这个按钮,你应用这个模板,并且有正确的DataContext。还有一招,如何提供给的DataContext是不是的VisualTree元素,描述here

应用该解决方案对你的代码,我们将有以下几点:

代理

public class BindingProxy : Freezable 
{ 
    #region Overrides of Freezable 

    protected override Freezable CreateInstanceCore() 
    { 
     return new BindingProxy(); 
    } 

    #endregion 

    public object Data 
    { 
     get { return (object)GetValue(DataProperty); } 
     set { SetValue(DataProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty DataProperty = 
     DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null)); 
} 

窗口。资源

<local:BindingProxy x:Key="proxy" Data="{Binding}" /> 

    <DataTemplate x:Key="ButtonOneDataTemplate"> 
     <Control x:Name="theControl" Template="{DynamicResource imgNo}" Foreground="Orange"/> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataContext.IsImageChanged}" Value="True"> 
       <Setter TargetName="theControl" Property="Template" Value="{DynamicResource imgUp}" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataContext.IsImageChanged}" Value="False"> 
       <Setter TargetName="theControl" Property="Template" Value="{DynamicResource imgDown}" /> 
      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 

HeaderTemplate中

<DataGridTextColumn.HeaderTemplate> 
    <DataTemplate> 
     <Border Background="Violet"> 
      <StackPanel> 
       <Button ContentTemplate="{StaticResource ButtonOneDataTemplate}" 
         DataContext="{Binding Path=Data, Source={StaticResource proxy}}" 
         Command="{Binding DataContext.ButtonClick, RelativeSource={RelativeSource AncestorType=Window}}" 
         CommandParameter="{Binding DataContext, RelativeSource={RelativeSource AncestorType=DataGrid}}"/> 
      </StackPanel> 
     </Border> 
    </DataTemplate> 
</DataGridTextColumn.HeaderTemplate> 
+0

万谢谢,Man!这真的很有用!:)非常感谢你! – StepUp

+1

欢迎您:) –