2009-12-22 10 views
1

我正在使用model-view-viewmodel我目前有一個包含3個數據的類:2個整數和一個枚舉。M-V-VM WPF:在將Databound對象的父對象傳遞給IValueConverter的同時維護數據綁定的方法?

它的構造是這樣的:

//C# 
public Outcome(OutcomeEnum outcomeEnum, Int32 acutalOutcomeData, Int32 expectedOutcomeData) 
{ 
    m_outcomeEnum = outcomeEnum; 
    m_actualData = acutalOutcomeData; 
    m_expectedData = expectedOutcomeData; 
} 

我有2個組合框旁邊,對方說我已綁定到結果對象(List<Outcome>),我使用了「實際」的一個列表和「預期」整數值。

這部分代碼看起來是這樣的:(本的SelectedItem和的ItemsSource是在視圖模型依賴屬性)

<ComboBox ItemsSource="{Binding Path=OutcomeList}" SelectedItem="{Binding SelectedExpectedOutcome, Mode=TwoWay}" x:Name="PART_cbExpectedOutcome" Grid.Column="1" > 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <Label Content="{Binding Path=ExpectedOutcomeData, Converter={StaticResource OutcomeDataToStringConverter}, ConverterParameter=Expected }" /> 
      </StackPanel> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 
<ComboBox ItemsSource="{Binding Path=OutcomeList}" SelectedItem="{Binding SelectedActualOutcome, Mode=TwoWay}" x:Name="PART_cbActualOutcome" Grid.Column="2" > 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <Label Content="{Binding Path=ActualOutcomeData, Converter={StaticResource OutcomeDataToStringConverter}, ConverterParameter=Actual}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

我的問題是:我想傳遞給結果對象的引用進我正在使用的IValueConverter之間進行轉換,但這似乎不可能使用IConvertParameter,而是我將被迫使用Multibinding根據msdn post here

我想簡化我的方法,創建一個相對簡單的多重綁定,這看起來像是過度殺傷。

我想只做一件事,我試圖傳入IValueConverter,它是確定OutcomeEnum的枚舉類型,以便我可以提供預期或實際數據值的正確格式。

有沒有更簡單的方法讓我能夠將Outcome對象傳入IValueConverter OutcomeDataToStringConverter,同時保持與這個Outcome對象列表的雙向綁定?我接受建議。

回答

0

對於現在,我最終改變結果類,所以它只有一個成員 - outcomeData

然後創建成果的至少兩個對象列出了被綁定到組合框的ItemsSource時 - ActualOutcomeList和ExpectedOutcomeList。

然後,我可以將結果對象本身綁定到Combobox上,但是通過使用兩個列表來避免我在Avaid的帖子的評論中描述的重複選擇問題。

最終的代碼看起來是這樣的:

<ComboBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <Label Content="{Binding Converter={StaticResource OutcomeToStringConverter}}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 

</ComboBox> 

<ComboBox 
    x:Name="PART_cbActualOutcome" 
    Grid.Column="2" 
    ItemsSource="{Binding Path=ActualOutcomeList}" 
    SelectedItem="{Binding SelectedActualOutcome, Mode=TwoWay}" 
    IsEnabled="{Binding Path=IsOutcomeEnabled}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <Label Content="{Binding Converter={StaticResource OutcomeToStringConverter}}" /> 

      </StackPanel> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 
1

爲什麼不綁定到整個Outcome對象而不是它的ActualOutcomeDataExpectedOutcomeData屬性?這樣轉換器將收到整個Outcome對象,並基於它和轉換器參數返回適當的值。

<ComboBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel> 
      <Label Content="{Binding Converter={StaticResource OutcomeToStringConverter}, ConverterParameter=Expected}"/> 
     </StackPanel> 
    </DataTemplate> 
</ComboBox.ItemTemplate> 
+0

這是一個好主意,我想的第一件事。問題是,如果我在兩個組合框上綁定了Outcome對象,如果我只有一個Outcome對象列表*兩個組合框將同步到同一個對象。實際上,這意味着當我改變一個組合框時,它可以改變另一個組合框的值,例如,列表中有3個項目,實際/預期等於1/1,2/2和3/3。如果您將組合框1更改爲2,則顯示2/2,當我真的想要2/1時。 – CrimsonX 2009-12-23 14:40:11

+0

我相信你應該通過設置IsSynchronizedWithCurrentItem爲false來實現選擇組合框的分離......請讓我知道如果不是這樣的話。 – 2009-12-24 09:40:23