2017-06-13 53 views
0

我在ItemsControl中託管了64個UserControl的列表,DataContext是一個對象數組。然後,UserControl的單個實例的DataContext將成爲對象的實例。帶DataTemplate觸發器的UniformGrid無法按預期工作,WPF

對象有一個名爲Exists的布爾變量,這是一個DataTemplate觸發器,用於確定是否顯示Usercontrol

我使用Uniformgrid來顯示列表,但我遇到了一些奇怪的行爲。 Usercontrol不會調整大小。見附圖。如果我使用StackPanel代替,它工作得很好。但我想用UnifromGrid代替。

以下是代碼 - 只有4個對象將Exist變量設置爲true。

<Grid Grid.Row="1" Grid.Column="1" x:Name="gridSome" Background="#FF5AC1F1"> 
     <Viewbox> 
      <ItemsControl ItemsSource="{Binding SomeVM.SomeModel.SomeArray}" 
          Margin="15" HorizontalAlignment="Center" VerticalContentAlignment="Center"> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <tensioner:UCView Margin="5"/> 
         <DataTemplate.Triggers> 
          <DataTrigger Binding="{Binding Exists}" Value="False"> 
           <Setter Property="Visibility" Value="Collapsed"/> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <!--<StackPanel IsItemsHost="true"/> This works--> 
         <UniformGrid Columns="1"/> <!-- This does not work--> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
      </ItemsControl> 
     </Viewbox> 
    </Grid> 

Uniform Grid

Stack Panel

-----更新------

// SSCCE 主窗口

<Window x:Class="WpfAppItemIssue.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfAppItemIssue" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.DataContext> 
     <local:MainViewModel/> 
    </Window.DataContext> 
    <Grid> 
     <!--<Viewbox>--> 
      <ItemsControl ItemsSource="{Binding Model.Cars}"> 
      <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <TextBox Text="ABC"></TextBox> 
         <DataTemplate.Triggers> 
          <DataTrigger Binding="{Binding exists}" Value="False"> 
           <Setter Property="Visibility" Value="Collapsed"/> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <UniformGrid Columns="1"/> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
      </ItemsControl> 
     <!--</Viewbox>--> 
    </Grid> 
</Window> 

MainViewModel

using System.ComponentModel; 

namespace WpfAppItemIssue 
{ 
    class MainViewModel:INotifyPropertyChanged 
    { 

     public MainViewModel() 
     { 
      Model = new MainModel(); 
     } 

     private MainModel model; 
     public MainModel Model 
     { 
      get 
      { 
       return model; 
      } 
      set 
      { 
       model = value; 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     public void OnPropertyChanged(string name) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(name)); 
      } 
     } 
    } 
} 

型號

namespace WpfAppItemIssue 
{ 
    class MainModel 
    { 
     public Car[] Cars { get; set; } 

     public MainModel() 
     { 
      Cars = new Car[64]; 
      for (int i = 0; i < Cars.Length; i++) 
      { 
       Cars[i] = new Car(i); 
      } 
     } 
    } 

    internal class Car 
    { 
     public int someVal { get; set; } 
     public bool exists { get; set; } 

     public Car(int someVal) 
     { 
      this.someVal = someVal; 
      if (someVal < 5) //Just enable few items for debug 
      { 
       exists = true; 
      } 
      else 
      { 
       exists = false; 
      } 
     } 
    } 
} 

見附件圖片:

圖1顯示設計視圖。爲什麼用戶控件不能調整大小? 圖2顯示執行。爲什麼用戶控件不能調整大小? 圖3顯示了任何調整大小事件。控件正在正確調整大小。 Design ViewExecute Resize

+0

如果'StackPanel'對你更好,你爲什麼需要'UniformGrid'? – dymanoid

+0

XAML中「Viewbox」的用途是什麼? – Maxim

+0

我想縮放'ItemsControl'以適應'Grid'。而且,現在我想縮放'UserControls'以適應多列中的'UniformGrid'。 –

回答

1

嗯,我終於在討論後的評論中得到了你的問題。這是關於ItemTemplate中的DataTrigger。只需將其移動到ItemContainerStyleTriggers並且元素將被正確調整大小。

<ItemsControl ItemsSource="{Binding Model.Cars}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <UniformGrid Columns="1"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemContainerStyle> 
     <Style TargetType="{x:Type ContentPresenter}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding exists}" Value="False"> 
        <Setter Property="Visibility" Value="Collapsed"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBox Text="ABC"></TextBox> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

注意TextBox「ES將只調整‘的邊界’(這種行爲顯示在你的最後一張照片),字體大小不會改變。如果你想用他們的內容來統一你的元素,你真的需要將ItemsControl換成Viewbox

+0

這就是@Maxim!我已經投票並接受你的答案作爲解決方案。謝謝。 –

1

這不是一個怪異的行爲,但它的UniformGrid的工作方式。作爲ItemsControlItemsPanelUniformGrid使用ItemSource集合來確定行數和列數。放置在UniformGrid中的項目是否可見 - 無關緊要 - 所有網格單元具有相同的寬度和高度。因此,您的DataTriggerUniformGrid的佈局沒有影響,它隻影響項目的可見性。

StackPanel以不同的方式工作。沒有單元格,StackPanel將所有的項目排列成可用空間。

+0

好吧,它很奇怪,因爲在設計時 - 這些項目佔用了可用空間。當我編譯和執行時,他們沒有。我不能使用'StackPanel',因爲有64個用戶控件,我希望它們被排列成多行,'UniformGrid'可以做。 –