2012-03-28 76 views
2

我有一個對象編輯器視圖,它顯示簡單的數據以及對使用TemplateSelector進行模板化的值的解釋。如果原始值得到更新,則解釋值也會更新,反之亦然。在一個簡單的DataTemplate中,它運行良好,但我有一個更復雜的場景,其中值(ushort)表示位圖(標誌字段)。爲此,我使用帶有ItemTemplate的ItemsControl。這可以在值 - >標誌方向上正常工作,但在點擊標誌時不起作用。我在MVVM世界如此不希望被反應在xaml.cs文件的事件......通過TemplateSelector在DataTemplate中進行雙向數據綁定

視圖的資源:

<DataTemplate x:Key="StandardTemplate"> 
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> 
      <TextBox Margin="0" VerticalAlignment="Top" Width="50" Text="{Binding Formatted,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" /> 
     </StackPanel> 
    </DataTemplate> 

    <DataTemplate x:Key="BitmapTemplate" > 
     <ItemsControl ItemsSource="{Binding Flags,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" > 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 

      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <StackPanel HorizontalAlignment="Center" Width="20"> 
         <TextBlock Text="{Binding BitPosition,Converter={StaticResource intConverter},ConverterParameter=1}" HorizontalAlignment="Center" /> 
         <CheckBox HorizontalAlignment="Center" HorizontalContentAlignment="Center" IsChecked="{Binding IsBitSet,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" /> 
        </StackPanel> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 

     </ItemsControl> 
    </DataTemplate> 


    <selectors:EditTemplateSelector x:Key="EditSelector" BitmapTemplate="{StaticResource BitmapTemplate}" StandardTemplate="{StaticResource StandardTemplate}" /> 

它得到的觀點:

<ContentPresenter Content="{Binding Register}" Grid.Row="2" Grid.ColumnSpan="2" Margin="10" ContentTemplateSelector="{StaticResource EditSelector}" /> 

我的位圖和BitmapBit類:

public class BitmapBit : ObservableObject 
{ 
    ushort _bitPosition = 0; 
    bool _isSet = false; 

    public BitmapBit(ushort bitPos, bool isSet) 
    { 
     _bitPosition = bitPos; 
     _isSet = isSet; 
    } 

    public ushort BitPosition 
    { 
     get { return _bitPosition; } 
     set 
     { 
      if (_bitPosition == value) 
       return; 

      _bitPosition = value; 
      RaisePropertyChanged("BitPosition"); 
     } 
    } 

    public bool IsBitSet 
    { 
     get { return _isSet; } 
     set 
     { 
      if (_isSet == value) 
       return; 

      _isSet = value; 
      RaisePropertyChanged("IsBitSet"); 
     } 
    } 
} 

/// <summary> 
/// A collection of BitmapBits 
/// </summary> 
public class Bitmap : ObservableCollection<BitmapBit> 
{ 
    const ushort NUMBER_OF_BITS = sizeof(ushort) * 8; // 8 BITS_IN_A_BYTE 

    protected Bitmap(ushort value) : base() 
    { 
     for (ushort i = 0; i < NUMBER_OF_BITS; ++i) 
      Insert(0, new BitmapBit(bitPos: i, isSet: (value & (1 << i)) != 0)); 
    } 


    public static Bitmap Create(ushort value) 
    { 
     return new Bitmap(value); 
    } 

    public static ushort Parse(Bitmap bits) 
    { 
     ushort generated = 0; 
     foreach (BitmapBit bit in bits) 
      generated += (ushort)(bit.IsBitSet ? 2^bit.BitPosition : 0); 
     return generated; 
    } 
} 

的IsBitSet setter方法被調用,但我認爲問題是,Bitma p沒有涉及位已更改的通知 - 所以標誌設置者永遠不會被調用。當ObservableCollection的成員更改時,如何更新/通知Flags屬性?

回答

1

這是因爲您的複選框正在更新由您的轉換器創建的BitmapBit對象。他們對你的ItemsControl單獨調用的轉換器本身一無所知。

如果你想要更新原始ushort,那麼你真的想直接從你的ViewModel而不是通過轉換器公開BitmapBit集合。通過這種方式,您可以更新在BitmapBit對象中保留虛擬機參考,並更新BitmapBit設置器中的ushort。

編輯: 你的編輯清理了一下,但問題仍然是我所得到的。 BitmapBits不知道底層的Bitmap,所以不要更新它。

你沒有顯示你的Flags是如何定義的,所以我不能告訴你如何更新它,但基本上所有你需要做的就是觀察每個BitmapBit的變化,就像View一樣,通過訂閱PropertyChanged :

protected Bitmap(ushort value) : base() 
{ 
    for (ushort i = 0; i < NUMBER_OF_BITS; ++i) 
    { 
     var bit = new BitmapBit(bitPos: i, isSet: (value & (1 << i)) != 0); 
     bit.PropertyChanged += (s, e) => UpdateFlags(); 
     Insert(0, bit); 
    } 
} 
+0

啊我看到你在和我的編輯反映了轉換器的刪除 - 正如你正確地指出的是添加一層混淆。潛在的問題現在更清晰我認爲,但我仍然沒有解決方案! – AndyC 2012-03-28 16:42:28

+0

編輯了我的答案 – GazTheDestroyer 2012-03-28 17:37:01

+0

燈泡瞬間!那是缺失的環節;位圖構造現在需要生成位圖的對象,以便標誌可以在位更改時更新。謝謝你帶領我通過! – AndyC 2012-03-28 19:19:29