2017-10-31 9 views
0

メインビューのグリッドに配置されたビューのプロパティを設定する際に問題があります。具体的には、それを隠すボタンを実装すると同時に、この列の横にある別のビューの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に関するこのフォーラムにはたくさんのエントリーがありましたが、私の問題に答える答えは見つからず、どれも私のために働かないことがわかりました。私は解決策を見つけることに何の問題も一度もなかったが、今度は私の最初の質問を作成するためのアカウントを作成しなければならなかった。 誰にもこのコードの何が悪いと思いますか?あるいは、私が気づいていないもう一つのアプローチがこの状況では良いでしょうか?

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

 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; 
    } 

ユーザは次にCollapseEventが公開されるFileExplorerViewでボタンを押し、MainViewModelはそのイベントをサブスクライブし、特定の方法を実行します。私はこの部分を何度もチェックし、うまく動作します。問題はXAMLのどこかにあると思う。

+0

ビューモデルも表示できますか? –

+0

問題はありません。ViewModelsで質問を更新しました – Thompson95

+0

どうしてうまくいかないのですか?ビジュアルスタジオ出力のバインディングエラー? – 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のは間違っていることを指摘いただき、誠にありがとうございます、それは私をたくさん助けました。

関連する問題