WPF, Как изменить свойства (видимость ..) динамически создаваемых компонентов пользовательского интерфейса при загрузке - PullRequest
0 голосов
/ 09 ноября 2018

Я хочу изменить свойства динамически заполненных компонентов пользовательского интерфейса.

enter image description here

Вот мой пример пользовательского интерфейса. Метка и три текстовых поля создаются динамически. Я хочу изменить видимость третьего текстового поля, если содержимое ярлыка - R11.

и добавить поле со статическим ресурсом, если метка R12

Вот мой пример кода

мой главный экран XAML

<StackPanel>

    <control:MethodControl></control:MethodControl>


    <ContentControl Content="{Binding ChildViewModel}" />

</StackPanel>

MainViewModel

class MethodViewModel : ViewModelBase
{
    #region Properties
    private Method _method;
    private PropertyViewModel _childViewModel;
    #endregion


    #region Getter & Setters


    public PropertyViewModel ChildViewModel
    {
        get { return this._childViewModel; }
        set
        {
            if (this._childViewModel != value)
            {
                this._childViewModel = value;
                RaisePropertyChanged(() => ChildViewModel);
            }
        }
    }



    public Method Method
    {
        get { return _method; }

    }

    public ICommand UpdateCommand
    {
        get; private set;
    }
    #endregion

    #region Constructor
    /// <summary>
    /// Initialize a new interface of the MEthodViewModel class
    /// </summary>
    public MethodViewModel()
    {
        //test
        _method = new Method();
        PropertyViewModel pwm = new PropertyViewModel();
        pwm.CollectProperties(_method.Name, _method.Helper);
        ChildViewModel = pwm;
        UpdateCommand = new UpdateCommand(SaveChanges, () => string.IsNullOrEmpty(_method.Error));

    }
    #endregion


    #region Functions

    public void SaveChanges()
    {

        PropertyViewModel pwm = new PropertyViewModel();
        pwm.CollectProperties(_method.Name, _method.Helper);
        ChildViewModel = pwm;
    }

Модель для детей

class PropertyViewModel : ViewModelBase
{

    private ObservableCollection<Property> _properties;

    public ObservableCollection<Property> Properties
    {
        get { return _properties; }
    }

    public PropertyViewModel(string method, string reflection)
    {
        _properties = new ObservableCollection<Property>();

        CollectProperties(method, reflection);
    }



    public void CollectProperties(string method, string reflection)
    {

        _properties.Clear();

        int methodindex = Array.IndexOf((String[])Application.Current.Resources["MethodNames"], method);


        switch (methodindex)
        {
            case 0:

                foreach (String prop in (String[])Application.Current.Resources["Result1"])
                {

                    PopulateProperty(prop, true);

                }
                break;

            default:

                foreach (String prop in (String[])Application.Current.Resources["Result2"])
                {

                    PopulateProperty(prop, true);

                }
                break;
        }

    }

    public PropertyViewModel()
    {
        _properties = new ObservableCollection<Property>();
    }

    private void PopulateProperty(string prop, bool p1)
    {
        Property temp = new Property(prop, "", 0, "");
        _properties.Add(temp);
    }



}

ChildViewModel XAML

<StackPanel >

    <ItemsControl ItemsSource = "{Binding Properties}" >

        <ItemsControl.ItemTemplate>
            <DataTemplate>

                <StackPanel Orientation = "Horizontal">
                    <Label Content="{Binding Name}"></Label>
                    <TextBox Text = "{Binding Path, Mode=TwoWay}" 
                        Width = "100" Margin = "3 5 3 5"/>

                    <TextBox Text = "{Binding StdDev, Mode=TwoWay}"
                                     Width = "100" Margin = "3 5 3 5"/>

                    <TextBox Text = "{Binding Unit, Mode=TwoWay}"
                                     Width = "100" Margin = "3 5 3 5"/>

                </StackPanel>

            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>


</StackPanel>        

и мои ресурсы

<x:Array x:Key="MethodNames" Type="sys:String"
      xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <sys:String>MM1</sys:String>
    <sys:String>MM2</sys:String>
    <sys:String>MM3</sys:String>

</x:Array>

<x:Array x:Key="HelperMethods" Type="sys:String"
      xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <sys:String>HM1</sys:String>
    <sys:String>HM2</sys:String>
    <sys:String>HM3</sys:String>

</x:Array>

<x:Array x:Key="Result1" Type="sys:String"
      xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <sys:String>R11</sys:String>
    <sys:String>R12</sys:String>
    <sys:String>R13</sys:String>

</x:Array>

<x:Array x:Key="Result2" Type="sys:String"
      xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <sys:String>R21</sys:String>
    <sys:String>R22</sys:String>
    <sys:String>R23</sys:String>

</x:Array>


<DataTemplate DataType="{x:Type modelViews:PropertyViewModel}">
    <control:PropertyControl  />
</DataTemplate>
  1. часть пользовательского интерфейса меняется в зависимости от выбора полей со списком.

Мне нужны целые 3 текстовых поля для некоторых опций, только 1 для некоторых и 1 текстовое поле и 1 комбинированное поле для некоторых опций зависит от имени метки.

Как добавить это свойство в динамически заполненный пользовательский элемент управления?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

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

вот бул конвертер видимости

 public class BoolToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, 
            object parameter, CultureInfo culture)
        {
           return (bool) value ? Visibility.Visible : Visibility.Collapsed;
        }
     
        public object ConvertBack(object value, Type targetType, 
            object parameter, CultureInfo culture)
        {
            // Do the conversion from visibility to bool
        }
    }

Ресурс

<converter:BoolToVisibilityConverter x:Key="converter"></converter:BoolToVisibilityConverter>

текстовое поле

<TextBox Visibility="{Binding HasUnit, 
            Converter={StaticResource converter}}" />

1012 *

0 голосов
/ 09 ноября 2018

Вы можете добавить один или несколько триггеров к DataTemplate, например ::100100

<DataTemplate>
    <StackPanel Orientation = "Horizontal">
        <Label Content="{Binding Name}"></Label>
        <TextBox Text = "{Binding Path, Mode=TwoWay}" Width = "100" Margin="3 5 3 5"/>
        <TextBox Text="{Binding StdDev, Mode=TwoWay}" Width="100" Margin="3 5 3 5"/>
        <TextBox x:Name="third" Text="{Binding Unit, Mode=TwoWay}" Width="100" Margin="3 5 3 5"/>
        <ComboBox x:Name="combo" Visibility="Collapsed" />
    </StackPanel>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Name}" Value="R11">
            <Setter TargetName="third" Property="Visibility" Value="Collapsed" />
            <Setter TargetName="combo" Property="Visibility" Value="Visible" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...