有什么方法可以检查XAML中的条件

时间:2019-07-16 11:51:36

标签: c# .net wpf data-binding

我有一个Datagrid,其中的数据基于某些选择来自数据库,因此值在不同的选择下会不断变化。

根据数据,我想在UI中添加一个TextBox吗?

这是.NET Framework 4.5

<DataGrid Name="Sampledatagrid" AutoGenerateColumns="True" ItemsSource="`{StaticResource MyCustomers}" Margin="0,0,0,106"/>

<Canvas>
    <br/>
    <!-- if Sampledatagrid.Value == 'Adam' -->
    <br/>
    <br/>
    <TextBox Canvas.Left="135" Canvas.Top="12" Style={StaticResource textboxstyle} />
    <br/>
    <br/>
</Canvas>

当Sampledatagrid包含“ Adam”时,应显示一个文本框。

1 个答案:

答案 0 :(得分:0)

首先,要让您的TextBox显示DataGrid的选定条目,请将其Text-Binding设置为相应的值。

只需以正确的方式添加'Text'属性:

<TextBox Text="{Binding ElementName=Sampledatagrid, Path=SelectedItem.Name}" Canvas.Left="135" Canvas.Top="12">

可能,变量“ SelectedItem.Name”的名称是“ Name”之外的另一个名称。

第二,如果TextBox仅显示“有效”名称(例如“ Adam”),我将向您展示如何使用转换器来实现。

在您的项目中创建一个名为“ ValidNamesConverter.cs”的新文件。该文件获取以下代码:

using System;
using System.Globalization;
using System.Windows.Data;

namespace WpfApp1
{
    internal class ValidNamesConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string valAsString = value.ToString();

            if (valAsString == "Adam" || valAsString == "Eve")
                return value;

            return string.Empty;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

在MainWindow.xaml(或UserControl.xaml)的“资源”部分中,添加此转换器类的实例(静态资源)。 (如果您还没有“资源”部分,只需添加一个):

<Window.Resources>
    <!-- make a XAML instance of the class ValidNamesConverter -->
    <local:ValidNamesConverter x:Key="validNamesConverter" />
</Window.Resources>

然后,扩展文本框的文本绑定以使用此转换器。

<TextBox Text="{Binding ElementName=Sampledatagrid, Path=SelectedItem.Name, Converter={StaticResource validNamesConverter}}" Canvas.Left="135" Canvas.Top="42">

在这种情况下,转换器决定将哪个字符串“转发”到TextBox。因此,如果为转换器指定了有效名称,它将再次返回该名称。如果给出的名称无效,则转换器将返回一个空字符串。

无论如何,在我的示例中,始终显示可见的TextBox。如果希望在选择无效名称时不显示TextBox,则可能需要将第二个转换器(例如ValidNameToVisibilityConverter)绑定到TextBox的Visibility-property。然后,该转换器返回Visibility.Visible或Visibility.Collapsed。在第二个转换器中,您可以使用ValidNamesConverter来避免在代码中两次使用一组有效名称。