首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定未用DataTemplateSelector更新

绑定未用DataTemplateSelector更新
EN

Stack Overflow用户
提问于 2015-09-08 07:24:09
回答 1查看 1.3K关注 0票数 1

我有一个基于MVVM的WPF应用程序。它有可以设置的参数。参数可以是复选框中的字符串列表,也可以是numupdown中的双字符串列表。每个设备都有自己的参数,因此参数是动态加载的。这就是为什么我使用DataTemplateSelector。

Xaml码

代码语言:javascript
复制
<ItemsControl ItemsSource="{Binding ParameterWrapperList}" ItemTemplateSelector="{StaticResource propertyDataTemplateSelector}">
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <StackPanel Orientation="Horizontal"></StackPanel>
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

模板在资源字典中:

代码语言:javascript
复制
    <DataTemplate x:Key="doubleTemplate">
        <Grid Visibility="{Binding Parameter.ParameterModel.IsVisible, Converter={StaticResource Visibility}}">
            <Grid.RowDefinitions>
                <RowDefinition Height="{Binding Path=RowHeight, Mode=OneWay}"/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Border Grid.Row="0" Style="{StaticResource HeaderBorderStyle}" Width="{Binding Width}" Visibility="{Binding HeaderVisibility, Converter={StaticResource Visibility}}">
                <StackPanel Orientation="Horizontal">
                    <Label Content="{Binding Parameter.DisplayName}"/>
                </StackPanel>
            </Border>
            <Border Grid.Row="1" Style="{StaticResource ItemBorderStyle}" Width="{Binding Width}">                
                <telerik:RadNumericUpDown Name="nudParameterValue" Value="{Binding Path=ParameterValue, Mode=TwoWay}" Minimum="{Binding Parameter.ParameterModel.MinimumValue}" Maximum="{Binding Parameter.ParameterModel.MaximumValue}" NumberDecimalDigits="{Binding Parameter.ParameterModel.NumberDecimalDigits}" SmallChange="{Binding Parameter.ParameterModel.SmallChanges}"/>                                   
            </Border>
        </Grid>
    </DataTemplate>
    <DataTemplate x:Key="stringTemplate">
        <Grid Visibility="{Binding Parameter.ParameterModel.IsVisible, Converter={StaticResource Visibility}}">
            <Grid.RowDefinitions>
                <RowDefinition Height="{Binding Path=RowHeight, Mode=OneWay}"/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Border Grid.Row="0" Style="{StaticResource HeaderBorderStyle}" Width="{Binding Width}" Visibility="{Binding Path=HeaderVisibility, Converter={StaticResource Visibility}}">
                <Label Content="{Binding Parameter.DisplayName}"/>
            </Border>
            <Border Grid.Row="1" Style="{StaticResource ItemBorderStyle}" Width="{Binding Width}" >
                <ComboBox ItemsSource="{Binding Path=Parameter.ParameterModel.PossibleValues}" SelectedIndex="{Binding ParameterValue, Mode=TwoWay}">

                </ComboBox>
            </Border>
        </Grid>
    </DataTemplate>
    <configControl:PropertyDataTemplateSelector
            StringTemplate="{StaticResource stringTemplate}"
            DoubleTemplate="{StaticResource doubleTemplate}"
            x:Key="propertyDataTemplateSelector"/>

我为DataTemplateSelector编写了代码。

代码语言:javascript
复制
    public class PropertyDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate DoubleTemplate { get; set; }
    public DataTemplate StringTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item,
               DependencyObject container)
    {
        DeviceModel.ParameterType devFunct = ((ParameterWrapper)item).Parameter.ParameterModel.Type;
        switch (devFunct)
        {
            case DeviceModel.ParameterType.Double:
                return DoubleTemplate;
            case DeviceModel.ParameterType.String:
                return StringTemplate;
            default:
                return null;
        }
        return null;            
    }
}

当应用程序打开时,所有的值都会被设置得很好。但是当我更新ParameterValue时,它并没有在视图中更新。(当我在控制台窗口中输出值时,值会被设置得很好(但在GUI中不会)。

我该怎么做才能让这件事成功。

编辑

这是它注定要做的代码。每个函数都有一个复选框,当您更改一个函数的参数时,所有其他选中的参数都需要更改。

代码语言:javascript
复制
        public double ParameterValue
    {
        get
        {
            return _parameter.ParameterValue;
        }
        set
        {
            Parameter.ParameterValue = value;
            Console.WriteLine("ParameterValueChanged");
            if (SetOthers)
            {
                if (_parentFunction.Checked)
                {
                    foreach (var function in _parentFunction.FunctionWrapperList)
                    {
                        if (function.Checked)
                        {
                            foreach (var parameterWrapper in function.ParameterWrapperList)
                            {
                                if (parameterWrapper.Parameter != this.Parameter)
                                {
                                    if (parameterWrapper.Parameter.ParameterModel == Parameter.ParameterModel)
                                    {
                                        Console.WriteLine(function.Function.Name + " " + function.Checked + " " + Parameter.ParameterValue);
                                        parameterWrapper.SetValue(Parameter.ParameterValue);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            Notify("ParameterValue");
        }
    }

    private void SetValue(double parameterValue)
    {
        SetOthers = false;
        Parameter.ParameterValue = parameterValue;
        SetOthers = true;
    }

布尔SetOthers是这样的,这样他就不会得到堆栈溢出并不断地设置自己。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-08 11:28:31

您的DataTemplateSelector不会更新呈现数据的DataTemplate,因为DataTemplateSelector不会触发属性更改。它只根据数据类型(yourData.GetType())选择一种显示数据的方式。

你想要的是一个触发器:

代码语言:javascript
复制
<ItemsControl ItemsSource="{Binding ParameterWrapperList}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding}">
                <ContentControl.Style>
                    <Style TargetType="{x:Type ContentControl}">
                        <Setter Property="ContentTemplate" Value="{StaticResource doubleTemplate}"/>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Parameter.ParameterModel.Type}" Value="{x:Static local:DeviceModel.ParameterType.String}">
                                <Setter Property="ContentTemplate" Value="{StaticResource stringTemplate}"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <StackPanel Orientation="Horizontal"/>
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32451644

复制
相关文章

相似问题

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