2016-02-16 4 views
0

Я не знаю, почему, но мое связывание видимости не работает ТОЛЬКО в DataTemplate. Я что-то забыл? Редактировать: Все привязки (за исключением этой работы отлично) Thats the structure.Проблемы с привязкой видимости в DataTemplate

<Window> 
<Grid> 
<Grid> 
<Grid Grid.Row="5"> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="Auto" /> 
       </Grid.RowDefinitions>     
        <ItemsControl x:Name="Targets" Margin="0,4,0,4"> 
        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
          <Grid Margin="0,5,0,5"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="*" /> 
            <ColumnDefinition Width="Auto" /> 
            <ColumnDefinition Width="Auto" /> 
           </Grid.ColumnDefinitions> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="Auto" /> 
            <RowDefinition Height="Auto" /> 
           </Grid.RowDefinitions> 

           <TextBox TextWrapping="Wrap" Foreground="{Binding Foreground, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" Text="{Binding Address, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}" Tag="{Binding}" PreviewKeyDown="ChangeLocationAddress" PreviewGotKeyboardFocus="TxtGotKeyboardFocusHandler" LostKeyboardFocus="ChangeLocationAddress" /> 
           <Button Margin="2,0,0,0" Grid.Column="1" Content=" ↑ " Click="MoveLocationUp" Visibility="Visible" /> 
           <Button Margin="2,0,0,0" Grid.Column="2" Content=" ↓ " Click="MoveLocationDown" Visibility="{Binding Path = UpDownButtonVisibility, UpdateSourceTrigger=PropertyChanged}"/> 
          </Grid> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 
      <Button x:Name="btnNewAddress" Grid.Row="1" Content="Neues Ziel hinzufügen" Margin="0,4,0,4" Visibility="{Binding Path=TargetButtonVisibility}"/> 
     </Grid> 
</Grid></Grid></Grid></Window> 

Codebehind:

public MapView(){ 
this.DataContext = this.ViewModel = new MapVM(); 
this.InitializeComponent(); 
this.Targest.Itemssource = this.ViewModel.ToLocations; 
} 

ViewModel:

public MapVM() 
     { this.UpDownButtonVisibility = Visibility.Collapsed; 
      this.TargetButtonVisibility = Visibility.Collapsed; 
     } 
private Visibility _UpDownButtonVisibility; 
    /// <summary> 
    /// Property Visibility für "↓" und "↑" 
    /// </summary> 
    public Visibility UpDownButtonVisibility 
    { 
     get { return _UpDownButtonVisibility; } 
     set 
     { 
      this._UpDownButtonVisibility = value; 
      NotifyPropertyChanged("UpDownButtonVisibility"); 
     } 
    } 
public Visibility TargetButtonVisibility { get; set; } 

EDIT: Программа выхода: BindingExpression ошибка путь: свойство 'UpDownButtonVisibility' не найден 'объекта' '' Место» (= HashCode -794088449)». BindingExpression: Path = UpDownButtonVisibility; DataItem = «Местоположение» (HashCode = -794088449); целевым элементом является «Button» (Name = ''); целевое свойство - «Видимость» (тип «Видимость») 1.10s

Любые предложения?

+0

Как объявляется TargetButtonVisibility ред? Проверьте это, потому что другой не работает. Мое первое предположение - проблема с тем, что вы не уведомляете пользовательский интерфейс об изменениях для UpDownButtonVisibility, но не видя другого, я предполагаю. –

ответ

0

DataContext вашего TargetButtonVisibility переплет - ваш основной MapVM. Это работает нормально.

DataContext в вашем DataTemplate является не MapVM, является его элемент отображается шаблоном.

Поскольку вы не поставили ни одного связанного с ItemsSource на вашем ItemsControl, мы не знаем, что это на самом деле.

Кроме того, как указывает unkreativ, не используйте видимость в вашей виртуальной машине, так как это связанный с представлением тип. Вместо этого используйте bool и вызовите свойство IsUpDownButtonVisible или подобное.

EDIT: Предполагая, что вы на самом деле хотите связываться с вашим единственным MapVM, вы могли бы использовать RelativeSource найти родителя ItemsControl:

<Button Margin="2,0,0,0" 
     Grid.Column="2" 
     Content=" ↓ " 
     Click="MoveLocationDown" 
     Visibility="{Binding DataContext.UpDownButtonVisibility, 
          RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemsControl}}"/> 

Однако, так как вы уже назвали ваш ItemsControl (Targets), вы можете просто называть его по имени:

<Button Margin="2,0,0,0" 
     Grid.Column="2" 
     Content=" ↓ " 
     Click="MoveLocationDown" 
     Visibility="{Binding DataContext.UpDownButtonVisibility, 
          ElementName=Targets}"/> 
+0

Да, в этом проблема, Надеюсь, я добавил достаточно информации. Теперь, как я могу правильно связать? –

+0

См. Править ....... – GazTheDestroyer

+1

Спасибо! Теперь я понимаю, ПОЧЕМУ я не работал, и теперь это происходит. –

0

Изменить строку Видимость

public Visibility UpDownButtonVisibility { get; set; } 
this.UpDownButtonVisibility = Visibility.Collapsed; 

Добавить INPC и связывание с видом модели.

Здесь работает образец:

XAML

<Window x:Class="ItemsControlDataTemplate.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:ItemsControlDataTemplate" 
      mc:Ignorable="d" 
      Title="MainWindow" Height="350" Width="525"> 
    <Window.DataContext> 
     <local:MainWindowViewModel /> 
    </Window.DataContext> 
    <Grid> 
     <ItemsControl x:Name="Targets" Margin="0,4,0,4" ItemsSource="{Binding Items}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Grid Margin="0,5,0,5"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="*" /> 
          <ColumnDefinition Width="Auto" /> 
          <ColumnDefinition Width="Auto" /> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="Auto" /> 
          <RowDefinition Height="Auto" /> 
         </Grid.RowDefinitions> 

         <TextBox TextWrapping="Wrap" Foreground="{Binding Foreground, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" Text="{Binding Address, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}" Tag="{Binding}" /> 
         <Button Margin="2,0,0,0" Grid.Column="1" Content=" ↑ " Visibility="Visible" /> 
         <Button Margin="2,0,0,0" Grid.Column="2" Content=" ↓ " Visibility="{Binding Path=UpDownButtonVisibility}"/> 

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

    </Grid> 
</Window> 

C#

class MainWindowViewModel : INotifyPropertyChanged 
{ 
    ObservableCollection<MapVM> _items = new ObservableCollection<MapVM>(); 

    public ObservableCollection<MapVM> Items { get { return _items; } } 


    public MainWindowViewModel() 
    { 
     Items.Add(new MapVM() { UpDownButtonVisibility = Visibility.Visible, Address = "1111111" }); 
     Items.Add(new MapVM() { UpDownButtonVisibility = Visibility.Collapsed, Address = "222222" }); 
     Items.Add(new MapVM() { UpDownButtonVisibility = Visibility.Visible, Address = "33333333" }); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

} 




class MapVM : INotifyPropertyChanged 
{ 

    public MapVM() 
    { 
     this.UpDownButtonVisibility = Visibility.Collapsed; 
     this.TargetButtonVisibility = Visibility.Collapsed; 
    } 

    private Visibility _upDownButtonVisibility; 
    public Visibility UpDownButtonVisibility 
    { 
     get { return _upDownButtonVisibility; } 
     set 
     { 
      _upDownButtonVisibility = value; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(UpDownButtonVisibility))); 
     } 
    } 


    private Visibility _targetButtonVisibility; 
    public Visibility TargetButtonVisibility 
    { 
     get { return _targetButtonVisibility; } 
     set 
     { 
      _targetButtonVisibility = value; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TargetButtonVisibility))); 
     } 
    } 

    private string _address; 
    public string Address 
    { 
     get { return _address; } 
     set 
     { 
      _address = value; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Address))); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 
+0

спасибо за этот быстрый ответ .. но: что не помогло. :( хотя this.TargetButtonVisibility = «Свернутый» работает –

+0

Может ЮО, пожалуйста, обновите ваш пост с большим количеством XAML и ViewModel, вы связываясь с. –

+1

Try, чтобы вызвать свойство измененного событие, когда UpDownButtonVisibility свойства изменяется. –

1

Я не могу найти обработчик события PropertyChanged и вызов к нему в своем коде. Добавьте INotifyPropertyChanged к вашему объекту DataContext и он должен работать

Лично я хотел бы моделировать видимость как bool и использовать BooleasnToVisibility Converter, который поставляется с WPF.

+0

Я обновил его, но он все еще не работает. –

Смежные вопросы