2010-06-02 13 views
13

Czy istnieje sposób, aby wykorzystać tę MultiBinding:oddanie MultiBinding na jednej linii w XAML

<TextBox.IsEnabled> 
    <MultiBinding Converter="{StaticResource LogicConverter}"> 
     <Binding ElementName="prog0_used" Path="IsEnabled" /> 
     <Binding ElementName="prog0_used" Path="IsChecked" /> 
    </MultiBinding> 
</TextBox.IsEnabled> 

i umieścić to wszystko w jednej linii, jak w <TextBox IsEnabled="" />?

Jeśli tak, to gdzie mogę poznać zasady tej formy?

+0

ja nie wierzę, że to możliwe, ale jestem zainteresowany, aby wiedzieć. – womp

+0

powiąż go bezpośrednio z prog0_used z niestandardowym konwerterem prog0_used-to-boolean? –

Odpowiedz

14

Podejście lepiej (i prostsze) byłoby określić styl jako zasób, który można łatwo zastosować do każdego TextBox:

<Window.Resources> 
    <c:MyLogicConverter x:Key="LogicConverter" /> 

    <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}" x:Key="MultiBound"> 
     <Setter Property="IsEnabled"> 
      <Setter.Value> 
       <MultiBinding Converter="{StaticResource LogicConverter}"> 
        <Binding ElementName="switch" Path="IsEnabled" /> 
        <Binding ElementName="switch" Path="IsChecked" /> 
       </MultiBinding> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 

<StackPanel Orientation="Horizontal"> 
    <CheckBox Name="switch" /> 
    <TextBox Name="textBox2" Text="Test" Style="{StaticResource MultiBound}" /> 
</StackPanel> 
3

Dla MultiBinding nie ma skróconą ciąg. Musisz użyć rozszerzonej składni elementu.

0

Można to zrobić z rozszerzeniem niestandardowych znaczników:

public class MultiBinding : System.Windows.Data.MultiBinding 
{ 
    public MultiBinding (BindingBase b1, BindingBase b2) 
    { 
     Bindings.Add(b1); 
     Bindings.Add(b2); 
    } 

    public MultiBinding (BindingBase b1, BindingBase b2, BindingBase b3) 
    { 
     Bindings.Add(b1); 
     Bindings.Add(b2); 
     Bindings.Add(b3); 
    } 

    // Add more constructors if you need. 
} 

Zastosowanie:

<TextBox IsEnabled="{local:MultiBinding 
    {Binding IsEnabled, ElementName=prog0_used}, 
    {Binding IsChecked, ElementName=prog0_used}, 
    Converter={StaticResource LogicConverter}}"> 
+0

Usunięto komentarz i utworzono nową odpowiedź. –

1

Próbowałem za odpowiedź niezgody, ale to nie działa od razu po wyjęciu z pudełka. Aby to działało Dodałem nowy konstruktor:

public class MultiBinding : System.Windows.Data.MultiBinding 
{ 
    public MultiBinding(BindingBase b1, BindingBase b2, object converter) 
    { 
     Bindings.Add(b1); 
     Bindings.Add(b2); 
     Converter = converter as IMultiValueConverter; 
    } 
} 

Wykorzystanie będzie wtedy tak:

<TextBox IsEnabled="{local:MultiBinding {Binding IsEnabled, ElementName=prog0_used}, 
{Binding IsChecked, ElementName=prog0_used}, 
{StaticResource LogicConverter}}"> 
+0

Chciałbym to osiągnąć, ponieważ mam tak wiele kontroli, które muszą reagować na wiele booleans, ale moje zachowanie się nie zachowuje: http://stackoverflow.com/questions/37057720/inline-multibinding-not-working-as-expected –