2012-06-15 4 views
0

Я пытаюсь создать стиль, который будет прикреплять к нему конвертер, чтобы при использовании этого стиля он автоматически использовал конвертер. Проблема, с которой я сталкиваюсь, заключается в том, что если я не задаю путь в стиле, компилятору это не нравится. Я не хочу устанавливать свойство «Path» привязки в стиле, потому что я хочу выбрать путь во время разработки. Не все элементы управления автоматически будут использовать одно и то же имя пути.Как я могу использовать IValueConverter в привязке для стиля без пути, чтобы каждый назначаемый элемент управления был контуром во время разработки?

Вот мой пример:

<Style x:Key="SomeCustomTextBox" BasedOn="{StaticResource {x:Type TextBox}}" TargetType="{x:Type TextBox}"> 
    <Setter Property="Text"> 
     <Setter.Value> 
      <Binding> 
       <Binding.Path>SomePath</Binding.Path> 
       <Binding.Converter> 
        <Converters:SomeIValueConverter/> 
       </Binding.Converter> 
      </Binding> 
     </Setter.Value> 
    </Setter> 
</Style> 

Кроме того, если я использую стиль в как и в следующей строке (здесь ржал) мой XAML код, он автоматически overides привязки не только обязательный пути всего ,

<TextBox Height="28" Name="someNameThatOveridesDefaultPath" Style="{StaticResource SomeCustomTextBox}" MaxLength="5" /> 

Возможно ли как-то сделать что-то подобное?

Спасибо! Патрик Мирон

+0

Правильно ли я думая, что вы хотите, чтобы имя текстовых полей стало путем привязки внутри стиля? – Andy

+0

что-то подобное может быть возможно с приложенным поведением, но это будет означать, что вы создадите привязку в коде. И последняя часть я не понимаю. – dowhilefor

+0

Путь не обязательно должен быть именем текстового поля, я хочу, чтобы он мог установить путь во время разработки, когда я создаю текстовое поле и назначаю стиль, не переопределяя конвертер, который я установил в стиле. Прямо сейчас, –

ответ

0

попробуйте использовать вложенное свойство, как этот

public class AttachedProperties 
{ 
    public static readonly DependencyProperty RawTextProperty = DependencyProperty.RegisterAttached(
     "RawText", 
     typeof(string), 
     typeof(AttachedProperties)); 

    public static void SetRawText(UIElement element, string value) 
    { 
     element.SetValue(RawTextProperty, value); 
    } 

    public static string GetRawText(UIElement element) 
    { 
     return element.GetValue(RawTextProperty) as string; 
    } 
} 

Затем в XAML

<Style x:Key="SomeCustomTextBox" BasedOn="{StaticResource {x:Type TextBox}}" TargetType="{x:Type TextBox}"> 
    <Setter Property="Text" Value="{Binding RelativeSource={RelativeSource Mode=Self}, 
    Path=local:AttachedProperties.RawText, Converter=Converters:SomeIValueConverter}"> 
    </Setter> 
</Style> 


<Grid> 
    <TextBox Style="{StaticResource SomeCustomTextBox}" 
       local:AttachedProperties.RawText="test text" /> 
</Grid> 

Я гавань протестировали код, но это идея

+0

Я вижу, что вы делаете в своем коде, но на этом этапе я должен не просто создать настраиваемый элемент управления? Я знаю, что это может быть короче, но я пытался избежать кода в своих ресурсных словарях ... Большое спасибо ... Я дам вам полные очки, но я бы не возражал, если бы не было никакого кодового решения. Как вы думаете, ваш ответ - единственный способ сделать это? –

+0

Единственный другой способ - иметь другой стиль для каждого возможного пути привязки –

+0

Кроме того, приложенные свойства должны быть в их собственных файлах классов, а не в коде для файлов ресурсов. Прикрепленные свойства должны быть широко задействованы, если это возможно, поскольку они избегают необходимости создавать собственные элементы управления во многих сценариях. Они полностью соответствуют MVVM –