在一個完美的世界裏,我們可以只對ComboBoxItem
的IsHighlighted
屬性綁定到在我們的視圖模型的屬性和設置Mode
到OneWayToSource
:
<ComboBoxItem IsHighlighted="{Binding MyViewModelBoolProperty}" />
然而,WPF不不允許任何綁定即使模式爲OneWayToSource
(表示我們的意圖是永不更新依賴項屬性,僅限其指定的源),也可以設置爲只讀依賴項屬性。有一個連接問題打開此:
http://connect.microsoft.com/VisualStudio/feedback/details/540833/onewaytosource-binding-from-a-readonly-dependency-property
在連接的問題,有一個解決辦法提出可以爲你工作。採取的方法是創建一個MultiBinding
到Tag
,其中一個綁定是您的只讀屬性,另一個綁定是您的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
和混淆我們的真正意圖,但它是有效的。希望這可以幫助!
很好,謝謝! – RandomEngy