2017-10-31 2 views
0

내 MainView의 그리드에 배치 된 뷰의 속성을 설정하는 데 문제가 있습니다. 특히 그것은 그것을 숨기고 동시에이 열 옆에있는 다른보기의 ColumnSpan을 모든 열에 걸쳐 놓는 단추를 구현하려는 TreeView 탐색기입니다. 내 XAML은 다음과 같습니다MVVM 다른 뷰에 배치 된 뷰의 속성을 변경하십시오.

<UserControl x:Class="ImageViewer.View.MainView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:ImageViewer.View" 
     xmlns:model="clr-namespace:ImageViewer.ViewModel" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 

<UserControl.DataContext> 
    <model:MainViewModel/> 
</UserControl.DataContext> 

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="50"/> 
     <RowDefinition Height="10*"/> 
     <RowDefinition Height="1*"/> 
    </Grid.RowDefinitions> 
    <Grid Grid.Row="1"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="2*"/> 
      <ColumnDefinition Width="62*"/> 
      <!--<ColumnDefinition Width="0.1*"/>--> 
      <ColumnDefinition Width="40*"/> 
      <ColumnDefinition Width="195*"/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 

     <local:FileExplorerView x:Name="fileExplorerView" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0.333"> 
      <local:FileExplorerView.Style> 
       <Style TargetType="{x:Type local:FileExplorerView}"> 
        <Setter Property="Visibility" Value="Visible"/> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding FileExplorerVisibility}" Value="Collapsed"> 
          <Setter Property="Visibility" Value="Collapsed"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </local:FileExplorerView.Style> 
     </local:FileExplorerView> 


     <local:TiledWindowView Margin="0,0,1,0.333"> 
      <local:TiledWindowView.Style> 
       <Style TargetType="{x:Type local:TiledWindowView}"> 
        <Setter Property="Grid.ColumnSpan" Value="1"/> 
        <Setter Property="Grid.Column" Value="2"/> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding FileExplorerVisibility}" Value="Collapsed"> 
          <Setter Property="Grid.ColumnSpan" Value="4"/> 
          <Setter Property="Grid.Column" Value="0"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </local:TiledWindowView.Style> 
     </local:TiledWindowView> 
    </Grid> 
    <local:MainMenuView Grid.Row="0"/> 
    <local:FooterView Grid.Row="2"/> 
</Grid> 
MainViewModel에서

내가 OnPropertyChange 메소드를 호출하고 내가 하나의 TextBlock에와보기를 교체하는 그것을 테스트하고 내가 할 수 있었기 때문에 제대로 작동하는지 100 % 확신 동일한 속성 인 FileExplorerVisibility에 대해 DataTrigger를 사용하여 XAML의 속성을 변경합니다. DataTriggers에 대한이 포럼에는 많은 항목이 있지만 그 중 아무 것도 내 문제에 대한 답변이 없으므로 아무 것도 찾을 수 없다는 것을 알고 있습니다. 나는 솔루션을 찾는 데 전혀 문제가 없었지만 이번에도 첫 번째 질문을 작성하기 위해 계정을 만들어야했습니다. 이 코드의 잘못된 점을 누구나 알고 있습니까? 아니면 내가 알지 못하는 다른 접근 방식이이 상황에서 더 나을 것입니까?

 public RelayCommand CollapseCommand { get; set; } 
    public FileExplorerViewModel() 
    { 
     CollapseCommand = new RelayCommand(CollapseExecute, CollapseCanExecute); 
    } 

    private void CollapseExecute(object obj) 
    { 
     _aggregator.GetEvent<CollapseEvent>().Publish(); 
     //Task.Run(() => CollapseMethod()); 
    } 

    private bool CollapseCanExecute(object obj) 
    { 
     return true; 
    } 

MainViewModel

 private Visibility fileExplorerVisibility = Visibility.Visible; 
    public Visibility FileExplorerVisibility { 
     get => fileExplorerVisibility; 
     set 
     { 
      fileExplorerVisibility = value; 
      NotifyPropertyChanged(); 
     } 
    } 
    public MainViewModel() 
    { 
     _aggregator.GetEvent<CollapseEvent>().Subscribe(Collapse); 
    } 

    public void Collapse() 
    { 
     FileExplorerVisibility = Visibility.Collapsed; 
    } 

FileExplorerViewModel 그래서 사용자는 MainViewModel 해당 이벤트를 구독하는 특정 방법을 실행 FileExplorerView의 버튼 다음 CollapseEvent 게시되어 누른다. 이 부분을 여러 번 확인했는데 정상적으로 작동합니다. 문제는 XAML 어딘가에 있다고 생각합니다.

+0

보기 모델을 표시 할 수 있습니까? –

+0

문제 없으며, ViewModels로 질문을 업데이트했습니다. – Thompson95

+0

정확히 작동하지 않는 것은 무엇입니까? Visual Studio 출력의 모든 바인딩 오류? – Evk

답변

0

좋아, 해결책을 찾았습니다. 어쩌면 그것은 최고의 것이 아니지만 그것은 작동합니다. 나는 위의 그리드 레벨의 특정 컬럼 안에 그리드의 뷰를 배치하고 뷰를 조작하지 않고 이러한 그리드의 특성을 설정했다. 이것은 일반적인 관행입니까 아니면 더 나은 해결책이 있습니까?

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="50"/> 
     <RowDefinition Height="10*"/> 
     <RowDefinition Height="1*"/> 
    </Grid.RowDefinitions> 
    <Grid Grid.Row="1"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="2*"/> 
      <ColumnDefinition Width="62*"/> 
      <!--<ColumnDefinition Width="0.1*"/>--> 
      <ColumnDefinition Width="40*"/> 
      <ColumnDefinition Width="195*"/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Grid Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,0,0.333"> 
      <Grid.Style> 
       <Style TargetType="{x:Type Grid}"> 
        <Setter Property="Visibility" Value="Visible"/> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding FileExplorerVisibility}" Value="Collapsed"> 
          <Setter Property="Visibility" Value="Collapsed"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Grid.Style> 
      <local:FileExplorerView/> 
     </Grid> 
    </Grid> 

Evk, DataContext가 잘못되었을 수 있음을 지적 해 주셔서 감사합니다. 많은 도움이되었습니다.