C#XAML Setter值为True,具体取决于字符串属性值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#XAML Setter值为True,具体取决于字符串属性值相关的知识,希望对你有一定的参考价值。

我遇到的麻烦似乎是一项相当简单的任务。我有一个带有节点的树视图,如果我的View Model的特定字符串属性'SearchTerm'不为空,我想将整个树视图的TreeViewItem'IsExpanded'属性设置为True。换句话说,如果string属性不为null,则IsExpanded值应为True。我已经在codebehind中完成了这个,但我更喜欢在XAML中这样做以保持清洁。

为了描述下面的代码,我创建了一个转换器,它将空字符串转换为'False',将非null转换为'True'。在我的XAML中,当我尝试从TreeView ItemContainerStyle中的viewmodel绑定字符串值时,我调用此转换器。似乎转换器从未被解雇过。

我的XAML(简化):

<UserControl.Resources>
    <cv:ExpandNodesIfSearchConverter x:Key="ExpandAll">
    </cv:ExpandNodesIfSearchConverter>
</UserControl.Resources>

<TreeView Grid.Row="2" x:Name="myTreeView"
      ItemsSource="{Binding Sponsors}"
      SelectedItemChanged="TreeView_SelectedItemChanged" >

        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                 <!-- if SearchTerm is not null, use converter to set value to true and expand all nodes -->
                <Setter Property="IsExpanded" Value="{Binding Path=SearchTerm, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ExpandAll}}" />
            </Style>
        </TreeView.ItemContainerStyle>

        <!-- TreeView data -->

    </TreeView>

我的视图模型:

public class TreeViewVM : INotifyPropertyChanged
{
    private string _searchterm;
    public string SearchTerm
    {
        get
        {
            return _searchterm;
        }
        set
        {
            _searchterm = value;
            OnPropertyChanged("SearchTerm");
        }
    }
}

我的转换器:

class ExpandNodesIfSearchConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        //if searchterm is not null, return true to expand all items, otherwise return false
        string searchterm = value.ToString();
        if (string.IsNullOrEmpty(searchterm))
            return false;
        else
            return true;
    }

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

我通过在Setter标记中使用ElementName而不是viewmodel属性解决了我的问题。 searchTxt是SeachTerm绑定的TextBox的名称。

<Setter Property="IsExpanded" Value="{Binding ElementName=searchTxt, Path=Text, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ExpandAll}}" />

以上是关于C#XAML Setter值为True,具体取决于字符串属性值的主要内容,如果未能解决你的问题,请参考以下文章

访问器属性:setter()函数和getter()函数

有关js 的 defineProperty函数 getter setter

如何观察 RestKit 中是不是存在字段。值为 null 时不调用 Setter

BOOL和bool的区别

activiti中的网关是干啥的?

Wpf:通用集合依赖属性