2011-10-09 62 views
1

我想讓ComboBoxItem.IsHighlighted屬性進入我的ViewModel。我想我可以設置物品容器的風格,並根據該屬性做一個觸發器,但然後我卡住了。數據綁定對於WPF中的組合框項很重要

<ComboBox ItemsSource="{Binding StartChapters}" SelectedItem="{Binding SelectedStartChapter}"> 
    <ComboBox.ItemContainerStyle> 
     <Style TargetType="ComboBoxItem"> 
      <Style.Triggers> 
       <Trigger Property="IsHighlighted" Value="True"> 
        <Setter ??? /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ComboBox.ItemContainerStyle> 
</ComboBox> 

所有我能找到的例子是設置一些其他的UI屬性,而不是讓數據備份到DataContext。

任何人都知道這可能是如何完成的?

回答

1

在一個完美的世界裏,我們可以只對ComboBoxItemIsHighlighted屬性綁定到在我們的視圖模型的屬性和設置ModeOneWayToSource

<ComboBoxItem IsHighlighted="{Binding MyViewModelBoolProperty}" /> 

然而,WPF不允許任何綁定即使模式爲OneWayToSource(表示我們的意圖是永不更新依賴項屬性,僅限其指定的源),也可以設置爲只讀依賴項屬性。有一個連接問題打開此:

http://connect.microsoft.com/VisualStudio/feedback/details/540833/onewaytosource-binding-from-a-readonly-dependency-property

在連接的問題,有一個解決辦法提出可以爲你工作。採取的方法是創建一個MultiBindingTag,其中一個綁定是您的只讀屬性,另一個綁定是您的ViewModel。 A轉換器則提供了設置您的視圖模型屬性:

<Grid> 
     <Grid.Resources> 
      <l:MyConverter x:Key="MyConverter" /> 
     </Grid.Resources> 

     <ComboBox VerticalAlignment="Center"> 
      <ComboBoxItem Content="Content Placeholder One" /> 
      <ComboBoxItem Content="Content Placeholder Two" /> 
      <ComboBoxItem Content="Content Placeholder Three" /> 
      <ComboBox.ItemContainerStyle> 
       <Style TargetType="{x:Type ComboBoxItem}"> 
        <Setter Property="Tag"> 
         <Setter.Value> 
          <MultiBinding Converter="{StaticResource MyConverter}"> 
           <Binding RelativeSource="{RelativeSource Self}" Path="IsHighlighted" /> 
           <Binding /> 
          </MultiBinding> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </ComboBox.ItemContainerStyle> 
     </ComboBox> 
    </Grid> 

和轉換器:

public class MyConverter : IMultiValueConverter 
    { 
     public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (values != null && values[0] is bool && values[1] is MyViewModel) 
      { 
       ((MyViewModel)values[1]).MyBoolProperty = (bool)values[0]; 
       return (bool)values[0]; 
      } 

      return DependencyProperty.UnsetValue; 
     } 

     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotSupportedException(); 
     } 

不是最好的解決方案,因爲它涉及到Tag和混淆我們的真正意圖,但它是有效的。希望這可以幫助!

+0

很好,謝謝! – RandomEngy