【问题标题】:Issues getting databinding working with Datagrid使用 Datagrid 进行数据绑定的问题
【发布时间】:2013-12-27 00:41:00
【问题描述】:

我使用 MVVM Light 框架,但我无法获得对我绑定的属性的任何反应

我有一个对象 BuyoutRule

public class BuyoutRule : ViewModelBase
{
   /*
   More private fields and properties
   */
    public int MaximumPrice
    {
        get { return _maximumPrice; }
        set
        {
            _maximumPrice = value;
            RaisePropertyChanged(() => MaximumPrice);
        }
    }

    public bool Enabled
    {
        get { return _enabled; }
        set
        {
            _enabled = value;
            RaisePropertyChanged(() => Enabled);
        }
    }

这些对象在这个类的 ObservableCollection 中

public class BuyoutCheapModuleViewModel : ViewModelBase
{

private ObservableCollection<BuyoutRule> _buyoutRules;
public ObservableCollection<BuyoutRule> BuyoutRules
    {
        get { return _buyoutRules; }
        set
        {
            _buyoutRules = value; 
            RaisePropertyChanged(() => BuyoutRules);
        }
    }
public BuyoutCheapModuleViewModel(IBuyoutRuleQuery buyoutRuleQuery)
      {
            BuyoutRules = new ObservableCollection<BuyoutRule>();
      }
}

然后我的 View 具有上一个类作为 Datacontext

<Grid>
    <ScrollViewer>
        <StackPanel>
            <DataGrid ItemsSource="{Binding BuyoutRules, Mode=TwoWay}"
                      SelectedItem="{Binding SelectedBuyoutRule, Mode=TwoWay}"
                      AutoGenerateColumns="False" CanUserAddRows="False">
                <DataGrid.Columns>
                    <DataGridTemplateColumn Header="Last Name" IsReadOnly="True">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Player.LastName}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="Rating" IsReadOnly="True">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Player.Rating}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="Last Name" IsReadOnly="True">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Player.Position}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

                    <DataGridTemplateColumn Header="Mininum Buyout" IsReadOnly="False" >
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <xctk:IntegerUpDown Increment="1000"
                                                    Value="{Binding MinimumBuyoutPrice, Mode=TwoWay}" 
                                                    Minimum="0"
                                                    FormatString="N0"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

                    <DataGridTemplateColumn Header="Maximum Buyout">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <xctk:IntegerUpDown Increment="1000"
                                                    Value="{Binding MaximumPrice, Mode=TwoWay}" 
                                                    Minimum="0"
                                                    FormatString="N0"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

                    <DataGridTemplateColumn Header="Enabled">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="{Binding Enabled, Mode=TwoWay}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
            <StackPanel Orientation="Horizontal">
                <Button Content="Remove" Command="{Binding RemoveSelectedCommand}" />
            </StackPanel>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding QuickbuyEnabled}">Enable quickbuy</CheckBox>
            </StackPanel>
        </StackPanel>
    </ScrollViewer>
</Grid>

但是,如果我在设置器中的 MaximumPrice 或 Enabled 中设置断点并更改我的 UI 中的值,则没有任何反应,我无法触发设置器,触发它们的唯一时间是创建视图和初始加载的数据被填写

【问题讨论】:

  • 在绑定上设置UpdateSourceTrigger=PropertyChanged,看看是否有帮助
  • 那行得通,虽然不能将您的评论标记为答案,只是以为我已经尝试过了,但之前一定错过了什么

标签: wpf xaml data-binding mvvm mvvm-light


【解决方案1】:

datagrid 单元格的默认 UpdateSourceTrigger 是 UpdateSourceTrigger=LostFocus,但您只需使用 CellTemplate,这意味着它永远不会受到影响。将其更改为 PropertyChanged 将允许您进行双向绑定。

【讨论】:

    猜你喜欢
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 2010-11-21
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多