【问题标题】:BoolToVisibilityConverter inside window.resourceswindow.resources 内的 BoolToVisibilityConverter
【发布时间】:2015-03-18 16:27:30
【问题描述】:

我有一个列表框,其中包含用户可以更改的标签和文本框。列表框内容在数据模板中定义(在 window.resources 内)。我想为列表中已使用 booltovisibility 转换器更改的每个项目添加一个边框。

我想我遇到了麻烦,因为我试图在 window.resources 中设置转换器。

有人可以指点我正确的方向吗?

查看模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.ComponentModel;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;

namespace MaintainPersonData
{
    public class MaintainPersonViewModel
    {
        public MaintainPersonViewModel(ObservableCollection<PersonViewModel> personList)
        {
        }

        public INotifyUser Notifier;

        private ObservableCollection<PersonViewModel> _personList;
        public ObservableCollection<PersonViewModel> PersonList
        {
            get
            {
                return _personList;
            }
            set
            {
                _personList = value;
                OnPropertyChanged("PersonList");
            }
        }

        private bool _changesMade;
        public bool ChangesMade 
        {
            get 
            {
                return _changesMade; 
            }
            set
            {
                _changesMade = value;
                OnPropertyChanged("ChangesMade");
            }
        }

        private bool _hasErrors;
        public bool HasErrors
        {
            get { return _hasErrors; }
            set
            {
                _hasErrors = value;
                if (!_hasErrors)
                {
                    ErrorMessage = "";
                }
                OnPropertyChanged("HasErrors");
            }
        }

Xaml:

<Window.Resources>
    <conv:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"/>

    <DataTemplate x:Key="ListBoxItemTemplate">
        <Border BorderBrush="LightGreen" BorderThickness="2" Visibility="{Binding ChangesMade, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource BoolToVisibilityConverter}}">
        <Grid>
            <TextBox x:Name="PersonTextBox" Text="{Binding PersonName, UpdateSourceTrigger=PropertyChanged}"/>
        </Grid>
    </Border>
   </DataTemplate>
</Window.Resources>

<Grid>
   <ListBox x:Name="PersonListBox" SelectionMode="Single" KeyboardNavigation.TabNavigation="Continue" ItemTemplate="{StaticResource ListBoxItemTemplate}" ItemsSource="{Binding PersonList}">
        <!-- Code to highlight selected item (http://stackoverflow.com/questions/15366806/wpf-setting-isselected-for-listbox-when-textbox-has-focus-without-losing-selec) -->
    </ListBox>

    <!-- BoolToVisibilityConverter works perfectly here -->
    <Label Name="ErrorLabel" Grid.Column="0" Foreground="Red" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="{Binding HasErrors, Converter={StaticResource BoolToVisibilityConverter}}" >
            <TextBlock Text="{Binding ErrorMessage, UpdateSourceTrigger=PropertyChanged}" />
        </Label>
     </Grid>       
</Window>

最后是转换器:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;

namespace MaintainRegexData
{
    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)
        {
            throw new NotImplementedException();
        }
    }
}

【问题讨论】:

  • 请说明您遇到了什么样的“麻烦”
  • 每次修改后将ChangesMade设置为True
  • ChangesMade 应该为每个PersonViewMode 定义,因为现在您将(或不会)为所有项目添加边框。您是否检查过来自BoolToVisibilityConverterConvert 方法是否被调用?最后一件事 - 在窗口资源中设置转换器没有任何问题。
  • 等一下。将可见性放​​在边框上将使内容消失。你想要的是在Thickness 上绑定一个Converter 以接收visibility,如果它不可见,将厚度设置为0
  • @AnyaHope 顺便说一句,您不需要编写自己的 Boolean-to-Visibility 转换器,这里有 already one in the .NET Framework

标签: c# wpf mvvm converter


【解决方案1】:

ChangesMade 应该为每个PersonViewMode 定义这是因为现在您将(或不会)为所有项目添加边框。您是否检查过调用了来自 BoolToVisibilityConverter 的 Convert 方法?最后一件事 - 在窗口资源中设置转换器没有任何问题。

【讨论】:

    【解决方案2】:

    首先你将ItemsSource绑定到PersonList,它的类型是ObservableCollection&lt;PersonViewModel&gt;,其中ChangesMade包含在MaintainPersonViewModel中,所以你需要将ChangesMade放在PersonViewModel类中并在personName 属性已更改。

    不要忘记@Frank 对 Border 的评价。

    【讨论】:

      猜你喜欢
      • 2013-12-16
      • 1970-01-01
      • 2012-06-24
      • 2023-03-16
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多