如何动态地使用户控件在HierarchicalDataTemplate编辑/只读?(How do I

2019-10-21 14:12发布

有谁知道如何在WPF HierarchicalDataTemplate动态改变的控件(文本框,组合框等)IsReadOnly属性?

我希望能够使包含在HierarchicalDataTemplate编辑对于某些用户的控制和只读别人。

我曾尝试结合在了HierarchicalDataTemplate在页面的视图模型预定布尔值,每个控制IsReadOnly属性,但我无法得到的结合工作。 任何帮助是极大的赞赏。

视图模型:

private bool _isReadOnlyBool;
public bool isReadOnlyBool
{
    get { return _isReadOnlyBool; }
    set
    {
        _isReadOnlyBool = value;
        RaiseChange("isReadOnlyBool");
    }
}

在这里,我表明含HierarchicalDataTemplate一个TreeView控件。 请注意,我试图绑定到HierarchicalDataTemplate TextBox的IsReadOnly值,从页面的视图模型布尔“isReadOnlyBool”值。

视图:

<TreeView HorizontalAlignment="Center" x:Name="treeView1" VerticalAlignment="Top" ItemsSource="{Binding Path=rsParentChild}"  Background="Transparent" BorderThickness="0" BorderBrush="Transparent" >
<TreeView.ItemContainerStyle>
    <Style>
        <Setter Property="TreeViewItem.IsExpanded" Value="True"/>
    </Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding Path=rsParentChild, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
        <Grid Focusable="False" Margin="5,10,5,10">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Label Content="Action Text" FontSize="8" Grid.Row="0" Grid.Column="0"/>
            <TextBox Grid.Row="1" Grid.Column="0" 
             IsReadOnly="{Binding isReadOnlyBool, RelativeSource={RelativeSource AncestorType={x:Type Page}}}" 
             Background="#99FFFFFF" 
             BorderBrush="Black" 
             Text="{Binding Path=actionText, Mode=TwoWay}" 
             TextWrapping="Wrap" Margin="0,0,0,0" 
             LostFocus="TextBox_LostFocus" 
            />
        </Grid>
    </HierarchicalDataTemplate>
</TreeView.ItemTemplate>

我得到以下绑定错误:

System.Windows.Data错误:40:BindingExpression路径错误: 'isReadOnlyBool' 属性不是 '对象' '' 行动(名称= '')”找到。 BindingExpression:路径= isReadOnlyBool; 的DataItem = '动作'(名称= ''); 目标元件是“文字框”(名称=“”); 目标属性是“IsReadOnly”(类型“布尔”)

Answer 1:

你的模型/视图模型结构是怎样的? 我有一个类似的问题,但我只是用的TextBlocks相反,但有些大胆需要,有不同的背景颜色等,所以结合这些动态是必要的。 我修改我的代码是相似的,你需要什么,添加文本框代替的TextBlocks,我能得到IsReadOnly属性工作。 这是我的树视图的XAML看起来像现在,它的修改。

    <TreeView x:Name="Tree" ItemsSource="{Binding Account}"  Margin="-2,45,-4,-18" BorderThickness="0,0,3,0" BorderBrush="{x:Null}" MouseDoubleClick="TreeViewItem_MouseDoubleClick_1">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Account}" DataType="{x:Type local2:Accounts}">
                    <TextBox Text="{Binding Header}" IsReadOnly="{Binding IsReadOnly}" />
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
   </TreeView>

一,这是我的模型是什么样子。

public class Accounts
{
    private readonly List<Accounts> accounts;
    public Accounts()
    {
        accounts = new List<Accounts>();
    }
    public bool IsNodeExpanded { get; set; }
    public string Header { get; set; }
    public Brush Foreground { get; set; }
    public Brush Background { get; set; }
    public FontWeight FontWeight { get; set; }
    public string Parent { get; set; }
    public bool IsReadOnly { get; set; }
    public List<Accounts> Account
    {
        get { return accounts; }
    }

}

你可以看到我的属性添加必要的,我的目的,我需要的一切,除了IsReadOnly。 我补充说,在文本框。 我使用的帐户列表创建就像在我的ViewModel结构的树,这就是被绑定到我的ItemsSource。 我就饶你的代码从我的视图模型,因为它是相当难看,但我会后的东西,将工作一小部分。

        private List<Accounts> accounts;
        public List<Accounts> Account
        {
            get { return accounts; }
            set
            {
                accounts = value;
                NotifyPropertyChanged("Accounts");
            }
        }

        void SetTree()
        {
            Account.Add(new Accounts { Header = "Accounts", IsReadOnly = true });
            Account[0].Account.Add(new Accounts { Header = "Product Type", Foreground = fGround, FontWeight = FontWeights.Bold, IsReadOnly = true });
            SortedSet<string> uniqueProductType = GetUniqueItems("Product Type");
            Accounts tempAccount;
            for (int i = 0; i < uniqueProductType.Count(); i++)
            {
                tempAccount = new Accounts { Header = uniqueProductType.ElementAt(i), Foreground = fGround, FontWeight = FontWeights.Normal };
                accountsSystemNode.Add(uniqueProductType.ElementAt(i), tempAccount);
                tempAccount.Account.Add(new Accounts { Header = "Client Preferred Account Name", Foreground = fGround, FontWeight = FontWeights.Bold, IsReadOnly = true });
                Account[0].Account[0].Account.Add(tempAccount);
            }
        }

为了让一些背景这段代码,我的树与一个标题开始,“帐户”,然后给出一组子类别。 其中一个子类别是“产品类型”。 帐户[0]是“帐户”和“账户”的节点是帐户[0] [0],“产品类型”。 然后,我通过产品类型我的列表循环填充产品类型,创建一个新帐户对象,并设置必要的值,并添加到我的“产品类型”节点。 请注意,我没有对这些设置的IsReadOnly值。 这是我如何验证它的工作原理。 对于每个类别的头衔,我IsReadOnly属性设置为true,无法对其进行编辑,而这个子类别中的实际值,IsReadOnly是假的,我可以编辑这些值。

这是这棵树将是什么样子。 我可以编辑这些文本框,你可以看到,但我不能编辑“帐户”或“产品类型”。



文章来源: How do I dynamically make user controls in a HierarchicalDataTemplate editable/read-only?