2011-05-05 109 views
3

我試圖解決這個事實,我無法爲ConverterParameter指定動態值。 See my other question for why I need to bind a dynamic value to ConverterParameter - 我不喜歡目前發佈的解決方案,因爲它們都需要我覺得應該對View Model進行不必要的更改。如何在靜態資源上設置依賴項屬性?

要嘗試解決這個問題,我創建了一個自定義轉換器,並在該轉換器暴露一個依賴屬性:

public class InstanceToBooleanConverter : DependencyObject, IValueConverter 
{ 
    public object Value 
    { 
     get { return (object)GetValue(ValueProperty); } 
     set { SetValue(ValueProperty, value); } 
    } 

    public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.Register("Value", typeof(object), typeof(InstanceToBooleanConverter), null); 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value != null && value.Equals(Value); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value.Equals(true) ? Value : Binding.DoNothing; 
    } 
} 

有沒有辦法使用綁定(或樣式setter方法來設置這個值,或其他瘋狂的方法)在我的XAML?

<ItemsControl ItemsSource="{Binding Properties}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate DataType="{x:Type local:SomeClass}"> 
      <DataTemplate.Resources> 
       <!-- I'd like to set Value to the item from ItemsSource --> 
       <local:InstanceToBooleanConverter x:Key="converter" Value="{Binding Path=???}" /> 
      </DataTemplate.Resources> 
<!- ... -> 

到目前爲止我見過的例子只綁定到靜態資源。

編輯:

我得到了一些反饋意見,只有一個與我張貼的XAML轉換器實例。

我可以解決此通過將資源在我的控制:

<ItemsControl ItemsSource="{Binding Properties}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate DataType="{x:Type local:SomeClass}"> 
      <RadioButton Content="{Binding Name}" GroupName="Properties"> 
       <RadioButton.Resources> 
        <!-- I'd like to set Value to the item from ItemsSource --> 
        <local:InstanceToBooleanConverter x:Key="converter" 
                 Value="{Binding Path=???}" /> 
       </RadioButton.Resources> 
       <RadioButton.IsChecked> 
        <Binding Path="DataContext.SelectedItem" 
          RelativeSource="{RelativeSource AncestorType={x:Type Window}}" 
          Converter="{StaticResource converter}" /> 
       </RadioButton.IsChecked> 
      </RadioButton> 
<!- ... -> 

所以這個問題不會被其共享轉換器:)

回答

1

不幸的是這」不是個實例t去工作 - 我以前走過這條路,事實證明ItemsControl中的所有Items共享相同的Converter。我認爲這是由於XAML解析器的工作原理。

+0

是的,我可以看到這是一個問題。但是我注意到,如果我將它設置爲控件上的資源,那麼每個控件都會得到一個實例。如果更有意義,我可以改變我的問題。 – 2011-05-05 20:40:22

0

首先你可以在更高層次上資源字典指定的轉換,並且設置x:Sharedfalse,其次,如果你想「的值設置爲項目的的ItemsSource」爲你註釋你可以指定一個空的綁定( Value="{Binding}")。

+0

感謝「x:共享」信息。至於綁定,當我執行'Value =「{Binding}」''時,我的依賴屬性的setter似乎永遠不會被調用。 – 2011-05-05 21:57:29

+0

內部機制不使用依賴項屬性的設置程序,它們僅用於代碼隱藏訪問。這就是爲什麼除了SetValue/GetValue調用之外,不應該在其中放置任何代碼。 – 2011-05-05 22:08:57

+0

你是對的關於setter沒有被調用。如果我從'Value =「{Binding}」'改變爲'Value =「{StaticResource someOtherResource}',那麼getter會返回那個靜態資源實例,但是setter永遠不會被調用,但是當我回到'Value =」{ Binding}「',getter返回'null' – 2011-05-05 23:56:49