2017-02-06 8 views
0

Если вы знаете, что такое прикрепленное свойство, тогда представьте случай, когда вам нужно поставить 2 или более из них вообще (here - пример), и только если все они установлены, произойдет что-то.Прикрепленный метод с параметрами

Это звучит как , вызывающий метод с параметрами для меня, поэтому тит.

Пробовал ли что-нибудь подобное? Я бы себе представить, что может также решить мои текущие проблемы с такими уродливыми глядя обходного (имеющий 10x времен 3 собственности):

<TextBox local:DynamicBinding.Property1="{Binding IsCheckedPath}" 
     local:DynamicBinding.Source1="{Binding IsCheckedSource}" 
     local:DynamicBinding.Target1="IsChecked" 
     local:DynamicBinding.Property2="{Binding WidthPath}" 
     local:DynamicBinding.Source2="{Binding WidthSource}" 
     local:DynamicBinding.Target2="Width" 
     local:DynamicBinding.Property3="{Binding TextPath" 
     local:DynamicBinding.Source3="{Binding TextSource}" 
     local:DynamicBinding.Target3="Text" ... /> 

В идеале хотелось бы что-то вроде этого

<TextBox IsChecked="{Binding Path={Binding IsCheckedPath}, Source={Binding IsCheckedSource}}" 
     Width="{Binding Path={Binding WidthPath}, Source={Binding WidthSource}}" 
     Text="{Binding Path={Binding TextPath}, Source={Binding TextSource}}" 

Or может быть, еще более краткими, любые идеи?

+0

Вы слышали о [MultiBinding] (https://blog.csainty.com/2009/12/wpf-multibinding-and.html)? –

+0

Почему вы просто не определяете 'Path = {Binding TextPath}' как 'Path = BindingTextPath' с свойством * switch * виртуальной машины? –

+0

@NawedNabiZada, да, как вы думаете, это будет выглядеть лучше? Добавить к нему, чтобы написать конвертер для * каждого * случая или это не требуется? – Sinatr

ответ

0

Итак, вместо связывания

Text="{Binding Path={Binding MyText}, Source={Binding MySource}}" 

Я хотел бы предложить, чтобы использовать переключатель свойству вашего идеала

Text="{Binding BindingMyText}" 

, которые могут быть реализованы с ViewModel посетителя (это выглядит более сложный, но это сделано для того, чтобы сделать незаконные государства непредставимыми)

internal abstract class IPropVisitor<A> 
{ 
    internal abstract A bindingMyText(ModelA source); 
    internal abstract void bindingMyText(ModelA source, A val); 
    internal abstract A bindingMyText(ModelB source); 
    internal abstract void bindingMyText(ModelB source, A val); 
} 

internal class ViewModelVisitor : IPropVisitor<string>, INotifyPropertyChanged 
{ 
    internal ViewModelVisitor(ModelSource model) 
    { 
     modelSource = model; 
     BindingMyText = "Test!"; 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    override internal string bindingMyText(ModelA source) 
    { 
     return source.MyTextA; 
    } 
    override internal void bindingMyText(ModelA source, string val) 
    { 
     source.MyTextA = val; 
    } 
    override internal string bindingMyText(ModelB source) 
    { 
     return source.MyTextB; 
    } 
    override internal void bindingMyText(ModelB source, string val) 
    { 
     source.MyTextB = val; 
    } 
    private ModelSource modelSource; 
    public ModelSource ModelSource 
    { 
     get { return modelSource; } 
     set 
     { 
      modelSource = value; 
      OnPropertyChanged("ModelSource"); 
      OnPropertyChanged("BindingMyText"); 
     } 
    } 
    public string BindingMyText 
    { 
     get 
     { 
      return modelSource.accept(this); 
     } 
     set 
     { 
      modelSource.accept(this, value); 
      OnPropertyChanged("BindingMyText"); 
     } 
    } 
} 

и много различных источников модели

public abstract class ModelSource : ViewModelBase 
{ 
    abstract internal A accept<A>(IPropVisitor<A> visitor); 
    abstract internal void accept<A>(IPropVisitor<A> visitor, A val); 
} 

class ModelA : ModelSource 
{ 
    private string myTextA; 
    public string MyTextA 
    { 
     get { return myTextA; } 
     set { 
      myTextA = value; 
      OnPropertyChanged("MyTextA"); 
     } 
    } 

    internal override A accept<A>(IPropVisitor<A> visitor) 
    { 
     return visitor.bindingMyText(this); 
    } 
    internal override void accept<A>(IPropVisitor<A> visitor, A val) 
    { 
     visitor.bindingMyText(this, val); 
    } 

} 

class ModelB : ModelSource 
{ 
    private string myTextB; 
    public string MyTextB 
    { 
     get { return myTextB; } 
     set 
     { 
      myTextB = value; 
      OnPropertyChanged("MyTextB"); 
     } 
    } 
    internal override A accept<A>(IPropVisitor<A> visitor) 
    { 
     return visitor.bindingMyText(this); 
    } 

    internal override void accept<A>(IPropVisitor<A> visitor, A val) 
    { 
     visitor.bindingMyText(this, val); 
    } 
} 

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

+0

Почему посетитель? Так много конкретных классов, методов, интерфейсов. Предположим, что это обязательная работа, просто дайте ей путь. Я не понимаю, почему это необходимо, и все же вам нужно сначала установить «ModelSource» (привязка xaml не имеет источника, как вы его устанавливаете?). Извините, но для меня это похоже на чрезмерную технику ... – Sinatr

+0

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

+0

, поэтому теперь я могу ввести источник модели через c.tor –