MultiBinding сетки видимости в WPF - PullRequest
0 голосов
/ 03 мая 2018

У меня есть элемент списка и я хочу свернуть некоторые элементы в строке списка Я использую сетку для редактирования шаблона данных. Я пытался работать с мульти-привязкой для параметра Однако я получил, что "DependencyProperty.UnsetValue" был бы рад за пример кода.

если я использую 1 параметр, все хорошо.

Может кто-нибудь объяснить мне, как использовать мульти-связывание был бы счастлив с примером кода. спасибо.

Рабочий код для 1 parmaeter Я могу использовать этот код:

<ListView x:Name="LVGuiCoreBus" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" MouseDown="LVGui_MouseDown"  Grid.Row="1" >               
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid Visibility="{Binding Source, Converter={StaticResource VisiblieGroupFilterBySourcecs}}">                                                                                                                              
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="130"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="50"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="50"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="100"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>                                                      
                    <ColumnDefinition Width="70"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="150"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="150"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="1*"></ColumnDefinition>
                </Grid.ColumnDefinitions>

                <TextBlock Text="{Binding DateNTimeStr}"  Foreground="Green" Grid.Column="0" />
                    <TextBlock Text="{Binding Source}" Foreground="{Binding Source,Converter={StaticResource CoreBusPanelModuleColorConverter}}" Grid.Column="2" Background="{ Binding Source, Converter={StaticResource BackGroundFilterConverterBySource}}" />
                    <TextBlock Text="{Binding Destination}" Foreground="{Binding Destination,Converter={StaticResource CoreBusPanelModuleColorConverter}}" Grid.Column="4" Background="{ Binding Destination, Converter={StaticResource BackGroundFilterConvertorByDestantation}}"  />
                    <TextBlock Text="{Binding Module}" Grid.Column="6" HorizontalAlignment="Center" Background="{ Binding Module, Converter={StaticResource BackGroundFilterByModule}}"   />
                    <TextBlock Text="{Binding Controll}" Grid.Column="8"  Background="{ Binding Controll, Converter={StaticResource BackGRoundFilterByControll}}"  />
                    <TextBlock Text="{Binding Command}" Grid.Column="10" HorizontalAlignment="Center"  Background="{ Binding Command, Converter={StaticResource BackGroundFilterByCommand}}"  />
                    <TextBlock Text="{Binding HSCommand}" Grid.Column="12" HorizontalAlignment="Center"  Background="{ Binding HSCommand, Converter={StaticResource BackGroundFilterByHsCommand}}"   />
                <TextBlock Text="{Binding Data_Str}"  Grid.Column="14"/>                                                                
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
    <ListView.ContextMenu>
        <ContextMenu x:Name="CMMenuCopy">
            <MenuItem x:Name="MCICopyLine" Header="Copy Line" Click="MCICopyLine_Click" ></MenuItem>
            <MenuItem x:Name="MCICopyText" Header="Copy Only Data Array" Click="MCICopyText_Click" ></MenuItem>
            <MenuItem x:Name="MCIClear" Header="Clear" Click="MCIClear_Click"></MenuItem>
        </ContextMenu>
    </ListView.ContextMenu>
</ListView>

не работает код мультисвязывания:

<ListView x:Name="LVGuiCoreBus" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" MouseDown="LVGui_MouseDown"  Grid.Row="1" >               
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid>
                  <Grid.Visibility>
                                    <MultiBinding Converter="{StaticResource MultiValueConvertorVisibility}" UpdateSourceTrigger="PropertyChanged">
                                        <Binding ElementName="Source" Path="Visibility"  UpdateSourceTrigger="PropertyChanged"></Binding>
                                        <Binding ElementName="Destination" Path="Visibility"  UpdateSourceTrigger="PropertyChanged"></Binding>
                                        <Binding ElementName="Module" Path="Visibility"  UpdateSourceTrigger="PropertyChanged"></Binding>
                                        <Binding ElementName="Controll" Path="Visibility"  UpdateSourceTrigger="PropertyChanged"></Binding>
                                        <Binding ElementName="Command" Path="Visibility"  UpdateSourceTrigger="PropertyChanged"></Binding>
                                        <Binding ElementName="HSCommand" Path="Visibility"  UpdateSourceTrigger="PropertyChanged"></Binding>
                                    </MultiBinding>
                                </Grid.Visibility>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="130"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="50"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="50"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="100"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>                                                      
                    <ColumnDefinition Width="70"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="150"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="150"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="1*"></ColumnDefinition>
                </Grid.ColumnDefinitions>

                <TextBlock Text="{Binding DateNTimeStr}"  Foreground="Green" Grid.Column="0" />
                    <TextBlock Text="{Binding Source}" Foreground="{Binding Source,Converter={StaticResource CoreBusPanelModuleColorConverter}}" Grid.Column="2" Background="{ Binding Source, Converter={StaticResource BackGroundFilterConverterBySource}}" />
                    <TextBlock Text="{Binding Destination}" Foreground="{Binding Destination,Converter={StaticResource CoreBusPanelModuleColorConverter}}" Grid.Column="4" Background="{ Binding Destination, Converter={StaticResource BackGroundFilterConvertorByDestantation}}"  />
                    <TextBlock Text="{Binding Module}" Grid.Column="6" HorizontalAlignment="Center" Background="{ Binding Module, Converter={StaticResource BackGroundFilterByModule}}"   />
                    <TextBlock Text="{Binding Controll}" Grid.Column="8"  Background="{ Binding Controll, Converter={StaticResource BackGRoundFilterByControll}}"  />
                    <TextBlock Text="{Binding Command}" Grid.Column="10" HorizontalAlignment="Center"  Background="{ Binding Command, Converter={StaticResource BackGroundFilterByCommand}}"  />
                    <TextBlock Text="{Binding HSCommand}" Grid.Column="12" HorizontalAlignment="Center"  Background="{ Binding HSCommand, Converter={StaticResource BackGroundFilterByHsCommand}}"   />
                <TextBlock Text="{Binding Data_Str}"  Grid.Column="14"/>                                                                
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
    <ListView.ContextMenu>
        <ContextMenu x:Name="CMMenuCopy">
            <MenuItem x:Name="MCICopyLine" Header="Copy Line" Click="MCICopyLine_Click" ></MenuItem>
            <MenuItem x:Name="MCICopyText" Header="Copy Only Data Array" Click="MCICopyText_Click" ></MenuItem>
            <MenuItem x:Name="MCIClear" Header="Clear" Click="MCIClear_Click"></MenuItem>
        </ContextMenu>
    </ListView.ContextMenu>
</ListView>
 public class MultiValueConvertorVisibility : IMultiValueConverter
 {
 public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool x = System.Convert.ToBoolean(values[0]);
        if (x)
        {
            return System.Windows.Visibility.Visible;
        }
        else
        {
            return System.Windows.Visibility.Collapsed;
        }
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
 }

1 Ответ

0 голосов
/ 03 мая 2018

Самым важным концептуальным элементом, который вам не хватает, является IMultiValueConverter, потому что видимость - это всего лишь одно значение, в конце дня вы хотите, чтобы ваша сетка была либо видимой, либо нет, поэтому вы должны указать мультисвязывание как объединить несколько значений в одно.

Вот пример того, как заставить работать мультисвязывание:

Сетка:

<Window x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp1"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Window.Resources>
    <local:MultiValueConverter x:Key="MyCustomConvertor"/>
</Window.Resources>


<Grid ShowGridLines="True">
    <Grid.Visibility>
        <MultiBinding Converter="{StaticResource MyCustomConvertor}" UpdateSourceTrigger="PropertyChanged">
            <Binding Path="Visibility"/>
        </MultiBinding>
    </Grid.Visibility>
    <Grid.RowDefinitions>
        <RowDefinition Height="100"/>
        <RowDefinition Height="100"/>
        <RowDefinition Height="100"/>
    </Grid.RowDefinitions>
</Grid>

Модель представления , к которой вы привязываетесь:

using System.ComponentModel;
using System.Windows;

namespace WpfApp1
{
    class VM : INotifyPropertyChanged
    {
        #region WPF integration properties
        public event PropertyChangedEventHandler PropertyChanged;

        // Create the OnPropertyChanged method to raise the event
        protected void OnPropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        #endregion

        private Visibility _visibility = Visibility.Hidden;
        public Visibility Visibility
        {
            get { return _visibility; }
            set
            {
                _visibility = value;
                OnPropertyChanged(nameof(Visibility));
            }
        }
    }
}

И, наконец, MultiValueConverter для преобразования нескольких привязок видимости в одну:

using System;
using System.Linq;
using System.Windows;
using System.Windows.Data;

namespace WpfApp1
{
    class MultiValueConverter : IMultiValueConverter
    {

        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {

            if (values.Contains(Visibility.Collapsed))
            {
                return Visibility.Collapsed;
            }

            if (values.Contains(Visibility.Hidden))
            {
                return Visibility.Hidden;
            }

            return Visibility.Visible;
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

    }
}

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

...