首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >作为绑定目标的属性不更新值

作为绑定目标的属性不更新值
EN

Stack Overflow用户
提问于 2015-06-23 14:19:53
回答 1查看 45关注 0票数 0

我试图用"IsSelected“属性扩展wpf按钮。我创建了一个依赖项对象,其属性如下所示:

代码语言:javascript
复制
class FormSelectorExtension : DependencyObject
{
    public static DependencyProperty IsSelectedProperty =
        DependencyProperty.RegisterAttached("IsSelected", typeof(bool), typeof(FormSelectorExtension),
        new PropertyMetadata(new PropertyChangedCallback(SelectionChanged)));

    public static bool GetIsSelected(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsSelectedProperty);
    }

    public static void SetIsSelected(DependencyObject obj, bool value)
    {
        obj.SetValue(IsSelectedProperty, value);
    }

    private static void SelectionChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        Console.WriteLine(obj.ToString());
    }
}

我想要对属性进行修改的按钮由ItemsControl生成:

代码语言:javascript
复制
 <ItemsControl x:Name="frameSelector" ItemsSource="{Binding Path=FrameSelectors}" Grid.Column="2" Grid.RowSpan="2" Width="150" VerticalContentAlignment="Stretch" HorizontalAlignment="Stretch">
 <ItemsControl.ItemsPanel>
     <ItemsPanelTemplate>
         <UniformGrid Columns="1"/>
     </ItemsPanelTemplate>
 </ItemsControl.ItemsPanel>
 <ItemsControl.ItemTemplate>
     <DataTemplate>
         <Button Content="{Binding Path=DisplayName}" Command="{Binding Path=ButtonCommand}" CommandParameter="{Binding Path=CommandParameter}"
                 Style="{StaticResource ResourceKey=FrameSelectorStyle}" FontSize="28" local:FormSelectorExtension.IsSelected="{Binding Path=Selected}"/>
     </DataTemplate>
 </ItemsControl.ItemTemplate>

现在的问题是,将我的视图模型中的"Selected“属性绑定到所访问的属性上。如果我使用的是静态值,那么可以正确地调用属性的"SelectionChanged“均数。

我一装上装订,就什么也没发生。(初始值已正确设置,但更改后的值不被识别。)

静态值

代码语言:javascript
复制
local:FormSelectorExtension.IsSelected="True"

绑定

代码语言:javascript
复制
local:FormSelectorExtension.IsSelected="{Binding Path=Selected}"

我更新视图模型的代码:

代码语言:javascript
复制
private void ActivateFrame(FormsFrame selectedFrame)
{
    ActiveFrame = selectedFrame;    

    foreach(var selector in FrameSelectors)
        selector.Selected = selector.DisplayName == selectedFrame.DisplayName;

    OnPropertyChanged("FrameSelectors");
    OnPropertyChanged("ActiveFrame");
}

我的ViewModel:

代码语言:javascript
复制
public class ButtonData
{
    public String DisplayName { get; set; }
    public bool Selected { get; set; }

    public ICommand ButtonCommand { get; set; }
    public object CommandParameter { get; set; }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-23 16:01:02

假设FrameSelectors是ButtonData实例的集合,那么您也必须在ButtonData类上实现INotifyPropertyChanged

代码语言:javascript
复制
public class ButtonData : INotifyPropertyChanged
{
    private bool selected;
    public bool Selected
    {
        get { return selected; }
        set
        {
            selected = value;
            OnPropertyChanged("Selected");
        }
    }

    ...
}

请注意,您的FormSelectorExtension类不需要从DependencyObject派生。这只对常规依赖属性是必需的,而对于附加属性则不是必需的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31005408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档