2013-06-26 66 views
1

我有一個ListBoxUniformGrid佈局,我試圖改變「列」屬性,但我不知道這樣做的最佳方式。我嘗試綁定到一個屬性或編程創建一個新的佈局,但我無法弄清楚。更改ListBox的UniformGrid列數的最佳方式是什麼?

<ListBox x:Name="ImagesList" ItemsSource="{Binding Path=GridImages}"> 
     <ListBox.ItemsPanel> 

      <ItemsPanelTemplate> 
       <UniformGrid IsItemsHost="True" Columns="3" VerticalAlignment="Top" /> 
      </ItemsPanelTemplate> 

     </ListBox.ItemsPanel> 
</ListBox> 

我想改變1和3列之間,當用戶點擊兩個按鈕。我已經嘗試綁定Columns="{Binding Path=MyColumnCount}",但它永遠不會更改,並嘗試設置x:Name並從我的代碼訪問,但沒有成功。我也嘗試實例化一個新的UniformGrid,但我讀過我需要一個工廠,所以我不能設置不同的Columns值。

+2

你試過的是什麼?請多些代碼。 –

+1

您何時需要更改列數?你的代碼應該觸發什麼? – Sphinxxx

+0

@newStackExchangeInstance我用更多的信息更新了這個問題。你需要實際的代碼嗎?當我開始工作時我可以得到它。 –

回答

1

我想也許ItemsPanelTemplate沒有繼承ListBox'DataContext,但它,所以你應該Binding工作:

<ListBox x:Name="ImagesList" ItemsSource="{Binding Path=GridImages}" > 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <UniformGrid IsItemsHost="True" Columns="{Binding Path=MyColumnCount}" 
         VerticalAlignment="Top" /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 

    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Image Source="{Binding}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

這個簡單的視圖模型,其上的定時器更新MyColumnCount試試:

public class ImagesVM : INotifyPropertyChanged 
{ 
    private System.Threading.Timer _timer; 
    private int _colIncrementor = 0; 

    public ImagesVM() 
    { 
     _timer = new System.Threading.Timer(OnTimerTick, null, 
              TimeSpan.FromSeconds(1), 
              TimeSpan.FromSeconds(1)); 
     _gridImages = new string[] { 
      "http://www.anbg.gov.au/images/flags/semaphore/a-icon.gif", 
      "http://www.anbg.gov.au/images/flags/semaphore/b-icon.gif", 
      "http://www.anbg.gov.au/images/flags/semaphore/c-icon.gif", 
      "http://www.anbg.gov.au/images/flags/semaphore/d-icon.gif", 
      "http://www.anbg.gov.au/images/flags/semaphore/e-icon.gif", 
      "http://www.anbg.gov.au/images/flags/semaphore/f-icon.gif", 
     }; 
    } 
    private void OnTimerTick(object state) 
    { 
     this.MyColumnCount = (_colIncrementor++ % 3) + 1; 
    } 

    private int _myColumnCount = 3; 
    public int MyColumnCount 
    { 
     get { return _myColumnCount; } 
     set 
     { 
      _myColumnCount = value; 
      this.PropertyChanged(this, new PropertyChangedEventArgs("MyColumnCount")); 
     } 
    } 

    private string[] _gridImages = null; 
    public string[] GridImages 
    { 
     get { return _gridImages; } 
    } 

    public event PropertyChangedEventHandler PropertyChanged = (s, e) => { }; 
} 
+0

謝謝,綁定正在工作!唯一的問題是我必須設置'DataContext'所有我希望屬性被刷新。像'ImagesList.DataContext = null; ImagesList.DataContext = this;'。但那可能是因爲我直接綁定到'MyWin:Windows'上,我想。這不是'東西:INotifyPropertyChanged' –

+1

好的,我明白了。 INotifyPropertyChanged和它的PropertyChanged事件是更新綁定值的祕訣。但是如果'MyColumnCount'是你的'Window'中的一個屬性,那麼你可以把它變成一個'DependencyProperty',它有自己的魔法更新機制。這篇文章有一些有用的鏈接:[什麼是依賴屬性?](http://stackoverflow.com/questions/617312/what-is-a-dependency-property) – Sphinxxx

+0

哇,它真的幫了我很多!謝謝!! :d –

相關問題