2014-10-29 39 views
2

我有一個與SelectedItem組合框。如果我選擇一個項目,我的設置器會進行一些計算,也許我想將值重設爲原來的值。不幸的是,我的觀點並沒有更新。我的c#ComboBox在選擇一個項目後不會調用getter。爲什麼?

我有以下組合框:

<ComboBox BorderThickness="0" VerticalAlignment="Center" Margin="2,0" 
    DisplayMemberPath="Name" 
    ItemsSource="{Binding ItemsVS.View}" 
    SelectedItem="{Binding SelectedItem, Mode=TwoWay}" > 

</ComboBox> 

這裏是我的ViewModel的屬性:

private CollectionViewSource _itemsVS; 
public CollectionViewSource ItemsVS 
{ 
    get { return _itemsVS; } 
    set 
    { 
     _itemsVS = value; 
     if(PropertyChanged!=null) 
      PropertyChanged(this, new PropertyChangedEventArgs("ItemsVS")); 
    } 
} 


private ItemViewModel _selectedItem; 
public ItemViewModel SelectedItem 
{ 
    get 
    { 
     // after setting the old value in the setter the getter is not called 
     // and the view is not refreshed 
     return _selectedItem; 
    } 
    set 
    { 
     var old = _selectedItem; 
     _selectedItem = value; 
     // After some logic I want to have the old value!!!!!!!!!!!!!! 
     _selectedItem = old; 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs("SelectedItem")); 


    } 
} 
+1

如果設置該屬性回到它的原始值,你已經調用之前'PropertyChanged',什麼是刷新?什麼也沒有變。 – 2014-10-29 15:44:04

+0

請使用WPF或ASP或任何其他標籤標記您的問題! – TaW 2014-10-29 15:46:01

+0

@BenRobinson真正的話題有點複雜。也許我不想設置「價值」和「舊」。 – koalabruder 2014-10-29 15:56:04

回答

2

如果你想使ComboBox設置新值後,回讀電流值,您需要爲您的Binding添加「無操作」Converter,該功能無效。這是一個有用的小技巧,因爲綁定通常不會檢查實際應用的源值是否與綁定提供的新值匹配。添加轉換器會強制它檢查。

public sealed class NoOpConverter : IValueConverter 
{ 
    public static readonly NoOpConverter Instance = new NoOpConverter(); 

    public object Convert(
     object value, 
     Type targetType, 
     object parameter, 
     CultureInfo culture) 
    { 
     return value; 
    } 

    public object ConvertBack(
     object value, 
     Type targetType, 
     object parameter, 
     CultureInfo culture) 
    { 
     return value; 
    } 
} 
<ComboBox SelectedItem="{Binding Path=SelectedItem, 
           Mode=TwoWay, 
           Converter={x:Static NoOpConverter.Instance}}" 
      ... /> 
+0

我喜歡這個答案,但是來自花生畫廊,想澄清一下:你說的綁定假設屬性getter將總是返回到傳遞給setter的東西,所以特別是_ignoring_這個'PropertyChanged'事件二傳手正在升高? – 2014-10-29 16:36:40

+1

它忽略源屬性的'PropertyChanged'事件,如果它們在更新源值*時發生*,因爲它*設置值時它將引發事件(畢竟它正在更改該值)。但是,是的,這種行爲是天真的,因爲它假定你不會用綁定提供的新值來替代新值。在WPF 4.5中,我相信他們改變了行爲,以便在更新源值後總是回讀,但出於兼容性考慮,無論如何您都應該使用此解決方法。 – 2014-10-29 16:47:19

相關問題