2008-12-18 42 views
10

我試圖實現一個wpf用戶控件,該轉換器將文本框綁定到使用轉換器的雙打列表。我如何將用戶控件的實例設置爲轉換器參數?該轉換器的轉換器參數應該是什麼

控件的代碼如下所示

由於

<UserControl x:Class="BaySizeControl.BaySizeTextBox" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:BaySizeControl" 
    > 
    <UserControl.Resources> 
     <local:BayListtoStringConverter x:Key="BaySizeConverter"/> 
    </UserControl.Resources> 
    <Grid> 

     <TextBox Name="Textbox_baysizes" 
        Text="{Binding RelativeSource={RelativeSource self}, 
           Path=Parent.Parent.BaySizeItemsSource, 
           Converter={StaticResource BaySizeConverter}}" 
        /> 
    </Grid> 
</UserControl> 

回答

8

的參數是用於通過您的轉換器所需要的常數。要爲轉換器提供對象實例,可以使用MultiBinding。

注意:要使此解決方案正常工作,您還需要修改轉換器以實現IMultiValueConverter而不是IValueConverter。幸運的是,所涉及的修改相當少。您可以爲提供給您的轉換器的值的數量添加驗證,2您的情況。

<TextBox Name="Textbox_baysizes"> 
    <TextBox.Text> 
     <MultiBinding Converter="{StaticResource BaySizeConverter}"> 
      <Binding RelativeSource="{RelativeSource self}" Path="Parent.Parent.BaySizeItemsSource"/> 
      <Binding ElementName="Textbox_baysizes"/> 
     </MultiBinding> 
    </TextBox.Text> 
</TextBox> 
+2

當然,您可以將對象引用作爲轉換器參數傳遞 - 確實如此,它必須被認爲是一個常量,因爲WPF無法讓轉換器參數在設置後重新綁定,但這並不意味着它可以「 t是一個對象引用! – 2008-12-18 13:50:28

+0

@Frederic:嘗試此代碼時出現錯誤。 「Property'Converter'不支持類型'BaySizeControl.BayListtoStringConverter'」的值。我的轉換器是否需要修改才能使用此解決方案? – 2008-12-18 14:53:58

+0

@Daniel Paull:聽起來好像可能會奏效。你能詳細解釋一下嗎?謝謝 – 2008-12-18 14:54:44

1

我會說出控制,然後綁定使用的ElementName:

<UserControl x:Class="BaySizeControl.BaySizeTextBox" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:BaySizeControl" 
    Name="Foobar" 
    > 
    <UserControl.Resources> 
     <local:BayListtoStringConverter x:Key="BaySizeConverter"/> 
    </UserControl.Resources> 
    <Grid> 

     <TextBox Name="Textbox_baysizes" 
        Text="{Binding RelativeSource={RelativeSource self}, 
           Path=Parent.Parent.BaySizeItemsSource, 
           Converter={StaticResource BaySizeConverter, 
           ConverterParameter={Binding ElementName=Foobar} }}" 
        /> 
    </Grid> 
</UserControl> 

不,等等,這是行不通的,因爲ConverterParameter不是一個依賴屬性,也不是綁定的DependencyObject。一個ReleativeSource標記擴展應該做你想要什麼,雖然我還沒有使用它嵌套在其他的MarkupExtension內 - 也許它不能很好地在這種情況下的表現:

<TextBox Name="Textbox_baysizes" 
         Text="{Binding RelativeSource={RelativeSource self}, 
            Path=Parent.Parent.BaySizeItemsSource, 
            Converter={StaticResource BaySizeConverter, 
            ConverterParameter={RelativeSource self} }}" 
         /> 
1

我有同樣的問題,但我不能使用MultiBindings,因爲我需要正確實現ConvertBack方法。下面是我最終實現了CheckBox的器isChecked財產的解決方案:

<CheckBox> 
    <CheckBox.IsChecked> 
     <Binding Converter="{StaticResource myConverter}" Path="Value"> 
      <Binding.ConverterParameter> 
       <FrameworkElement DataContext="{TemplateBinding DataContext}" /> 
      </Binding.ConverterParameter> 
     </Binding> 
    </CheckBox.IsChecked> 
</CheckBox> 

我不是超級熟悉TemplateBindings(或任何WPF對這個問題),所以也許這只是工作,因爲我的CheckBox是一個DataTemplate ...

11

另一種方法是讓你的轉換器繼承自DependencyObject(或FrameworkElement)。這使您可以聲明依賴項屬性,從而可以從XAML設置其值,甚至可以綁定。

示例:一個轉換器,用於乘以一個指定因子的值,該因子是從自定義控件(MyControl)中的屬性(FactorValue)中獲取的。

轉換器:

public class MyConverter : DependencyObject, IValueConverter 
{ 
    // The property used as a parameter 
    public double Factor 
    { 
     get { return (double) GetValue(FactorProperty); } 
     set { SetValue(FactorProperty, value); } 
    } 

    // The dependency property to allow the property to be used from XAML. 
    public static readonly DependencyProperty FactorProperty = 
     DependencyProperty.Register(
     "Factor", 
     typeof(double), 
     typeof(MyConverter), 
     new PropertyMetadata(1.15d)); 

    #region IValueConverter Members 

    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     // Use the property in the Convert method instead of "parameter" 
     return (double) value * Factor; 
    } 

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

在使用XAML:

<MyConverter x:Key="MyConv" 
      Factor={Binding ElementName=MyControl, Path=FactorValue} 
/> 

所以,你現在可以申報你在你的轉換器需要,並將其綁定每個參數的依賴特性。

相關問題