2017-09-15 104 views
0

禁用/啓用組合框項我有以下視圖模型:取決於選擇

private MovementType selectedMovementType = MovementType.Continous; 
private bool isMovementSelectable; 
private readonly DeviceSelection DeviceSelection; 

public AxisActionsViewModel(...) 
{ 
    .... 
    this.isMovementSelectable = false; 
    this.DeviceSelection.Devices.CollectionChanged 
     += this.Devices_CollectionChanged; 
    .... 
} 


    public bool IsMovementSelectable 
    { 
    get => this.isMovementSelectable; 

    set 
    { 
     this.isMovementSelectable = value; 
     this.OnPropertyChanged(); 
    } 
    } 

    private void Devices_CollectionChanged(
    object sender, 
    System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 

     if (this.transportDeviceSelection.TransportDevices.Any(item => item.Name.ToLower().Contains("a")) 
     || this.transportDeviceSelection.TransportDevices.Any(item => item.Name.ToLower().Contains("b"))) 
    { 
     this.IsMovementSelectable = false; 
    } 
    else 
    { 
     this.IsMovementSelectable = true; 
    } 
    } 

    public IEnumerable<MovementType> MovementTypes 
    { 
    get 
    { 
     yield return MovementType.Continous; 
     yield return MovementType.Relative; 
     yield return MovementType.Absolute; 
    } 
    } 

    public MovementType SelectedMovementType 
    { 
    get => this.selectedMovementType; 

    set 
    { 
     if (this.selectedMovementType != value) 
     { 
      this.selectedMovementType = value; 

      this.OnPropertyChanged(() => this.SelectedMovementType); 

      this.UpdateMovementTemplate(); 
     } 
    } 
    } 

,並在視圖中的視圖模型

<UIComboBox Grid.Row="0" Grid.Column="6" Grid.ColumnSpan="6" 
        ItemsSource="{Binding MovementTypes}" 
        SelectedItem="{Binding SelectedMovementType}"> 

      <UIComboBox.ItemContainerStyle> 
       <Style TargetType="UIComboBoxItem"> 
       <Setter Property="IsEnabled" 
         Value="{Binding IsMovementSelectable}"/> 
       </Style> 
      </UIComboBox.ItemContainerStyle> 

我的問題的IsMovementSelectable屬性綁定現在,如何我是否正確實現了此功能? 我希望當選擇A或B時,ComboBox僅包含特定項目。 我在哪裏放置IsMovementSelectable屬性以獲得想要的行爲? 我嘗試了不同的方法,但沒有導致積極的結果。

+0

最簡單的方法是使用一個集合來過濾視圖組合的項目源,則這將它們傳遞到組合 – MikeT

+0

我覺得之前刪除任何無效的值,你的觀念就錯了。你比較string.tolowercase和一些像'A'這樣的大寫字母。 2.foreach設備打開和關閉相同的值,因此IsMovementSelectable僅取決於最後一個設備。 3.你在DataContext中的每個ComboboxItem中查找IsMovementSelectable,這意味着,因爲這些項的dataContext只是枚舉值,setter將不起作用。所以,如果你想禁用所有項目,只需使用relativeSource。如果你想啓用/禁用不同的項目,你需要重新設計一些東西:你需要一些具有Value和bool屬性的dataModel。當然,在我的代碼的 – sTrenat

+0

我張貼之前,編輯代碼,並去掉了一些不必要的部分......我只用小寫在載有()...我已經作出關於你的#2檢查與。任何列表中的一些變化。 ..for#3我認爲你是對的... – SMa

回答

0

麥克評論,最好的是,如果你只是過濾什麼在你的組合框結束了,看看hereCollectionView可以很容易地照顧你需要做的,只是創建一個並綁定你ItemsSource它。

可能能夠維持目前的做法,並使用黑客以獲得所需的行爲,通過使用visibility屬性:

<Setter Property="Visibility" Value="{Binding IsMovementSelectable, Converter={StaticResource BoolToVisibilityConverter}}"/> 

您將需要創建一個BoolToVisibilityConverter轉換器,像this one 。 這沒有經過測試,我也不知道可能會得到什麼結果,但如果您不想或不能正確地重新編寫代碼,這可能會有訣竅。如果幸運的話,它會摺疊不應該顯示的項目。