DataTemplate中可见性绑定的问题

时间:2016-02-16 15:00:13

标签: c# wpf binding

我不知道为什么,但我的Visibility Binding仅在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>

代码隐藏:

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

视图模型:

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; }

编辑: 节目输出:     BindingExpression路径错误:'对象'''位置'(HashCode = -794088449)'上找不到'UpDownButtonVisibility'属性。 BindingExpression:路径= UpDownButtonVisibility; DataItem ='Location'(HashCode = -794088449); target元素是'Button'(Name ='');目标属性是“可见性”(类型“可见性”)1.10s

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

将字符串更改为“可见性”

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

添加INPC并绑定到View模型。

以下是工作样本:

<强> 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;
}

答案 1 :(得分:1)

我找不到PropertyChanged事件处理程序并在代码中调用它。将INotifyPropertyChanged添加到DataContext对象,它应该可以正常工作

就个人而言,我会将可见性建模为bool,并使用WPF附带的BooleasnToVisibility Converter。

答案 2 :(得分:0)

DataContext绑定的TargetButtonVisibility是您的主要MapVM。这没问题。

DataContext中的DataTemplate MapVM,模板是否显示项目

由于您尚未在ItemsSource上提供任何ItemsControl绑定,我们无法知道这实际是什么。

此外,正如unkreativ指出的那样,不要在VM中使用Visibility,因为这是与视图相关的类型。请改用bool并调用属性IsUpDownButtonVisible或类似。

编辑:假设您确实想要绑定到您的单个MapVM,您可以使用RelativeSource来查找父ItemsControl 1}}:

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

但是,由于您已经命名了ItemsControlTargets),因此您只需按名称引用它:

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