Изменение контроллера свойства на основе значения свойства другого контроллера в wpf - PullRequest
0 голосов
/ 25 апреля 2020

Рассмотрим в моем приложении wpf, у меня есть флажок и 2 текстовых сообщения, как показано ниже:

<CheckBox x:Uid="Checkbox_1" FlowDirection="RightToLeft" IsChecked="{Binding TickCheckBox, Mode=TwoWay}" Style="{StaticResource StandardCheckBoxStyle}">My Checkbox</CheckBox>

<dxe:TextEdit x:Uid="dxe:TextEdit_1" Grid.Row="1" Grid.Column="1" Width="100" Style="{StaticResource FleetScheduledHoursStyle}" EditValue="{Binding RealValue, Mode=OneWay}" EditMode="InplaceInactive" ToolTipService.ShowDuration="20000" />

<dxe:TextEdit x:Uid="dxe:TextEdit_2" Grid.Row="1" Grid.Column="1" Width="100" Style="{StaticResource FleetScheduledHoursStyle}" EditValue="{Binding RealValue, Mode=OneWay}" EditMode="InplaceInactive" ToolTipService.ShowDuration="20000" />

TickCheckBox привязан к свойству в моей модели представления, как показано ниже:

private bool tickCheckBox;
public bool TickCheckBox
{
    get
    {
        return this.tickCheckBox;
    }
    set
    {
        if (this.TickCheckBox.Equals(value))
        {
               return;
        }
        this.tiketCheckBox = value;
        this.NotifyPropertyChange(() => this.TickCheckBox);
    }
}

Как изменить свойство "EditMode" одного из текстовых сообщений (скажем, Text_Edit1) на "InplaceActive", когда я поставил галочку?

Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Вы можете использовать IValueConverter:

BoolToEditModeConverte.cs

public class BoolToEditModeConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    if (!(value is bool isChecked))
    {
      throw new ArgumentException("Converter value must be of type 'bool'");
    }
    return isChecked 
      ? EditMode.InplaceInactive
      : EditMode.None;
  }

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

Использование

<Window>
  <Window.Resources>
    <BoolToEditModeConverte x:Key="BoolToEditModeConverte" />
  </Window.Resources>

  <CheckBox x:Name="MyCheckbox" />

  <TextEdit EditMode="{Binding ElementName=MyCheckBox, 
                               Path=IsChecked, 
                               Converter={StaticResource BoolToEditModeConverte}}" />
</Window>
0 голосов
/ 25 апреля 2020

Поскольку вы используете POCOViewModel, вы просто определяете свойство для TextEdit.EditMode и привязки в xaml и определяете метод для измененного события TickCheckBox в модели представления poco, например:

public partial class MainWindow : Window {
    public MainWindow() {
        InitializeComponent();
        this.DataContext = Vm.Create();
    }
}

[POCOViewModel]
public class Vm {
    public virtual bool TickCheckBox { get; set; } = false;
    public virtual EditMode EditMode { get; set; } = EditMode.InplaceInactive;

    public static Vm Create() => ViewModelSource.Create(() => new Vm());

    protected void OnTickCheckBoxChanged() {
        if (this.TickCheckBox) {
            // or this.EditMode = EditMode.InplaceActive;
            this.EditMode = EditMode.Standalone;
        } else {
            this.EditMode = EditMode.InplaceInactive;
        }
    }
}

и xaml:

<StackPanel>
    <CheckBox x:Uid="Checkbox_1" FlowDirection="RightToLeft" IsChecked="{Binding TickCheckBox, Mode=TwoWay}">
        My Checkbox
    </CheckBox>

    <dxe:TextEdit
        x:Uid="dxe:TextEdit_1"
        EditMode="{Binding EditMode}"
        EditValue="{Binding RealValue, Mode=OneWay}"
        ToolTipService.ShowDuration="20000" />
    <dxe:TextEdit
        x:Uid="dxe:TextEdit_2"
        EditMode="Standalone"
        EditValue="{Binding RealValue, Mode=OneWay}"
        ToolTipService.ShowDuration="20000" />
</StackPanel>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...